二维树状数组处理矩阵区间加区间查询


#include<iostream>

using namespace std;

namespace IO{
    struct INID{INID(){ios::sync_with_stdio(false);cin.tie(nullptr);}};
    static INID INI_D;
    inline int gc(){return cin.rdbuf()->sbumpc();}
    inline void pc(char c){cout.rdbuf()->sputc(c);}
    template<typename T>inline void rd(T& x){
        x=0;int f=1,c=gc();
        while('0'>c||c>'9'){if(c==EOF){cerr<<"IIE\n";exit(EXIT_FAILURE);}if(c=='-'){f*=-1;}c=gc();}   
        while('0'<=c&&c<='9'){x=x*10+c-'0';c=gc();}
        x*=f;   
    }
    template<typename T>inline void wt(T x){
        if(x<0)pc('-');
        static int stk[40],tp;
        do{stk[++tp]=(x%10<0?-x%10:x%10)+'0';x/=10;}while(x);
        while(tp)pc(stk[tp--]);
    }
}
using namespace IO;

#define int long long 

constexpr int N=2055;

int n,m;

struct bit2d{
    int t[N][N];
    inline int lowbit(int x){return x&(-x);}
    inline void add(int x,int y,int val){
        for(int i=x;i<=n;i+=lowbit(i)){
            for(int j=y;j<=m;j+=lowbit(j)){
                t[i][j]+=val;
            }
        }
    }
    inline int query(int x,int y){
        int ret=0;
        for(int i=x;i>0;i-=lowbit(i)){
            for(int j=y;j>0;j-=lowbit(j)){
                ret+=t[i][j];
            }
        }return ret;
    }
}t1,t2,t3,t4;

inline void addSingle(int x,int y,int val){
    t1.add(x,y,val);
    t2.add(x,y,val*x);
    t3.add(x,y,val*y);
    t4.add(x,y,val*x*y);
}
inline void addMatrix(int x1,int y1,int x2,int y2,int val){
    addSingle(x1,y1,val);
    addSingle(x1,y2+1,-val);
    addSingle(x2+1,y1,-val);
    addSingle(x2+1,y2+1,val);
}
inline int querySingle(int x,int y){
    int s1=t1.query(x,y);
    int s2=t2.query(x,y);
    int s3=t3.query(x,y);
    int s4=t4.query(x,y);
    return s4+(x+1)*(y+1)*s1-(x+1)*s3-(y+1)*s2;
}
inline int queryMatrix(int x1,int y1,int x2,int y2){
    return 
    +querySingle(x2,y2)
    -querySingle(x1-1,y2)
    -querySingle(x2,y1-1)
    +querySingle(x1-1,y1-1);
} 


inline void global(){

}



namespace tqy{
    inline void init(){
        gc();
        rd(n),rd(m);
    }
    inline void solve(){
        char op;
        while(cin>>op){
            int x1,y1,x2,y2,val;
            rd(x1),rd(y1),rd(x2),rd(y2);
            if(x1>x2)swap(x1,x2);
            if(y1>y2)swap(y1,y2);
            if(op=='L'){
                rd(val);
                addMatrix(x1,y1,x2,y2,val);
            }else{
                wt(queryMatrix(x1,y1,x2,y2));
                pc('\n');
            }
        }
    }
}

signed main(){
    global();
    int T=1;
    while(T--)tqy::init(),tqy::solve();
    return 0;
}
/*

*/

posted @ 2026-10-28 17:39  tqytql  阅读(9)  评论(0)    收藏  举报