p1358

这是一道二维树状数组模板题。

需要注意的可能只有这些xy有可能为零。那每次输入之后全部++,相当于全部向右下角移了一位。

那就直接给代码了呦。

using namespace std;
int c[1050][1050],n,m;
int i,f;
int a1,b1,a2,b2,tx,ty,tk;
int ans;
int lowbit(int x)
{
  return x&(-x);
}
int sum(int x,int y)
{
    ans=0;
    for(i=x;i>=1;i-=lowbit(i))
        for(f=y;f>=1;f-=lowbit(f))
            ans+=c[i][f];
    return ans;
}
void add(int x,int y,int v)
{
    for(i=x;i<=n;i+=lowbit(i))
        for(f=y;f<=n;f+=lowbit(f))
            c[i][f]+=v;
}
int main()
{
ios::sync_with_stdio(false);
//freopen("123.in","r",stdin);
//freopen("123.out","w",stdout);
    cin>>n;
    for(;;)
    {
        cin>>m;
        if(m==3)
            return 0;
        if(m==1)
        {
            cin>>tx>>ty>>tk;
            tx++;
            ty++;
            add(tx,ty,tk);
        }
        if(m==2)
        {
            cin>>a1>>b1>>a2>>b2;
            a1++;
            b1++;
            a2++;
            b2++;
            cout<<abs(sum(a2,b2)-sum(a1-1,b2)-sum(a2,b1-1)+sum(a1-1,b1-1) )<<endl;
        }
    }
}

 

posted @ 2018-09-02 13:54  zzuqy  阅读(194)  评论(0编辑  收藏  举报