imos2D

(a,b)(   )(   )
(   )(   )(   )
(   )(   )(c,d)  

update(a,b,c,d,x)でここの範囲に+xできる

build()をやったらOK


class imos2D{
    public :
    vector<vector<long long>> v;
    long long h,w;
    imos2D(long long H,long long W){
        h = H;
        w = W;
        v.assign(h,vector<long long>(w));
    }
    void update(long long a,long long b,long long c,long long d,long long x){
        v[a][b]+=x;
        if(c+1 < h)v[c+1][b]-=x;
        if(d+1 < w)v[a][d+1]-=x;
        if(c+1 < h && d+1 < w)v[c+1][d+1]+=x;
    }
    void build(){
        for(long long i = 0;i < h;i++){
            for(long long j = 1;j < w;j++){
                v[i][j] += v[i][j-1];
            }
        }
        for(long long j = 0;j < w;j++){
            for(long long i = 1;i < h;i++){
                v[i][j] += v[i-1][j];
            }
        }
    }
    vector<long long>& operator[](long long i){
        return v[i];
    }
    const vector<long long>& operator[](long long i) const{
        return v[i];
    }
};