有两个操作
1.在X,Y这个点上加上K的值
2.查询矩形 X1,Y1,X2,Y2的和
这题目真鬼畜。
二维线段树裸题…
但我搞的是BIT套线段树.
所以需要矩形割补一下
1.少打了的%d,导致加入的权值成了随机数,Debug20min发现…
2.矩阵割补打错了…
Vijos 1512
#include
#include
#define il inline
#define lowbit(x) x&-x
const int maxm=1e6+100;
int maxx=1100,maxy=1100;
int n;
struct T{
struct node{
int ls,rs;
int sum;
};
node st[maxm<<1];
int rt;
int asksum(int &now,int l,int r,int ql,int qr)
{
if(!now) return 0;
if(rqr) return 0;
if(ql<=l&&r<=qr)
return st[now].sum;
int mid=(l+r)>>1;
return asksum(st[now].ls,l,mid,ql,qr)+asksum(st[now].rs,mid+1,r,ql,qr);
}
void change(int &o,int l,int r,int ind,int num)
{
if(!o) o=++rt;
if(l>=r)
{
st[o].sum+=num;
return;
}
int mid=(l+r)>>1;
if(ind<=mid) change(st[o].ls,l,mid,ind,num);
else change(st[o].rs,mid+1,r,ind,num);
st[o].sum=st[st[o].ls].sum+st[st[o].rs].sum;
}
}tree;
struct B{
int root[maxm];
int ask(int a,int b)
{
int ans=0;
for(int i=a;i;i-=lowbit(i))
ans+=tree.asksum(root[i],1,maxy,1,b);
return ans;
}
void add(int x,int y,int val)
{
for(int i=x;i<=maxx;i+=lowbit(i))
tree.change(root[i],1,maxy,y,val);
//printf("%d %d\n",x,y);
}
}BIT;
il int read()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9')
{
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*w;
}
int main()
{
scanf("%d",&n);
while(1)
{
int opt,a,b,c,d;
scanf("%d",&opt);
if(opt==1)
{
scanf("%d%d%d",&a,&b,&c);
a++,b++;
BIT.add(a,b,c);
}
if(opt==2)
{
a=read(),b=read(),c=read(),d=read();
a++,b++,c++,d++;
int ans1=BIT.ask(c,d);
int ans2=BIT.ask(a-1,b-1);
int ans3=BIT.ask(c,b-1);
int ans4=BIT.ask(a-1,d);
printf("%d\n",ans1+ans2-ans4-ans3);
}
if(opt==3) return 0;
}
}