JOIOI上帝造题的七分钟(二维树状树组区间修改、区间查询)(2020.7.3)

JOIOI上帝造题的七分钟

二维树状树组区间修改、区间查询

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int n,m;
int a[2050][2050],t1[2050][2050],t2[2050][2050],t3[2050][2050],t4[2050][2050];
int lowbit(int x)
{
    return x&(-x);
}
void add(int x,int y,int v)
{
    for(int i=x;i<=n;i+=lowbit(i))
    {
        for(int j=y;j<=m;j+=lowbit(j))
        {
            t1[i][j]+=v;
            t2[i][j]+=v*x;
            t3[i][j]+=v*y;
            t4[i][j]+=v*x*y; 
        }
    }
}
void addd(int x,int y,int x1,int y1,int v)
{
    add(x,y,v);
    add(x,y1+1,-v);
    add(x1+1,y,-v);
    add(x1+1,y1+1,v);
}
int ask(int x,int y)
{
    int ans=0;
    for(int i=x;i;i-=lowbit(i))
    {
        for(int j=y;j;j-=lowbit(j))
        {
            ans+=(x+1)*(y+1)*t1[i][j]-(y+1)*t2[i][j]-(x+1)*t3[i][j]+t4[i][j];
        }
    }
    return ans;
}
int askk(int x,int y,int x1,int y1)
{
    return ask(x1,y1)-ask(x1,y-1)-ask(x-1,y1)+ask(x-1,y-1);
}
int inline read()
{
    int ans=0,f=1;
    char ch=getchar();
    if(ch==EOF) exit(0);
    while(!isdigit(ch))
    {
        if(ch=='-')
        f=-1;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        ans=ans*10+ch-'0';
        ch=getchar();
    }
    return ans*f;
}
char readchar()
{
    char ch;
    while (ch=getchar(),ch!=EOF && !isalpha(ch));
    return ch;
}
void write(int x)
{
    if(x<0) 
    {
        putchar('-');
        x=-x;
    }
    if(x/10) write(x/10);
    putchar(x%10+'0');
}
int main()
{
    char ch;
    int a,b,c,d,e;
    readchar();
    n=read();
    m=read();
    while(ch=readchar(),ch!=EOF)
    {
        a=read();
        b=read();
        c=read();
        d=read();
        if(ch=='L')
        {
            e=read();
            addd(a,b,c,d,e);
        }
        else
        {
            write(askk(a,b,c,d));
            putchar('\n');
        }
    }
    return 0;
}

 

posted @ 2020-07-03 17:33  莫得感情的约德尔人  阅读(75)  评论(0)    收藏  举报