SPOJ

忘记了单点更新时要在树状数组中减去原值。。wa了一发

/*
矩形求和,单点更改
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 1030
int bit[maxn][maxn],n;
void add(int x,int y,int num){
    for(int i=x;i<=n;i+=i&-i)
        for(int j=y;j<=n;j+=j&-j)
            bit[i][j]+=num;
}
int query(int x,int y){
    int res=0;
    for(int i=x;i;i-=i&-i)
        for(int j=y;j;j-=j&-j)
            res+=bit[i][j];
    return res;
}
int mp[maxn][maxn];
int main(){
    int t,x,y,num,x1,x2,y1,y2;
    char op[10];
    scanf("%d",&t);
    while(t--){
        memset(bit,0,sizeof bit);
        memset(mp,0,sizeof mp);
        scanf("%d",&n);
        while(scanf("%s",op)){
            if(op[0]=='E') break;
            if(op[2]=='T'){
                scanf("%d%d%d",&x,&y,&num);
                x++;y++;
                add(x,y,-mp[x][y]);
                add(x,y,num);
                mp[x][y]=num;
            }
            else {
                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                x1++,x2++,y1++,y2++;
                int ans=0;
                ans=query(x2,y2)-query(x2,y1-1)-query(x1-1,y2)+query(x1-1,y1-1);
                printf("%d
",ans);
            }
        }
    }
}
原文地址:https://www.cnblogs.com/zsben991126/p/10083852.html