二维线段树模板题:
#include
#include
#include
#include
#include
using namespace std;
const int maxx=1050;
struct node
{
int l,r;
int sum;
};
struct node1
{
int l,r;
node t[maxx<<2];
}q[maxx<<2];
void sbuild(int l,int r,int i,int k)
{
q[k].t[i].l=l;
q[k].t[i].r=r;
q[k].t[i].sum=0;
if(l==r)
{
return;
}
int mid=(l+r)/2;
sbuild(l,mid,i*2,k);
sbuild(mid+1,r,i*2+1,k);
}
void build(int l,int r,int ll,int rr,int i)
{
q[i].l=l;
q[i].r=r;
sbuild(ll,rr,1,i);
if(l==r)
{
return;
}
int mid=(l+r)/2;
build(l,mid,ll,rr,i*2);
build(mid+1,r,ll,rr,i*2+1);
}
void supdate(int y,int val,int i,int k)
{
q[k].t[i].sum+=val;
if(q[k].t[i].l==q[k].t[i].r)
{
return;
}
int mid=(q[k].t[i].l+q[k].t[i].r)/2;
if(y<=mid)
supdate(y,val,i*2,k);
else
supdate(y,val,i*2+1,k);
}
void update(int x,int y,int val,int i)
{
supdate(y,val,1,i);
if(q[i].l==q[i].r)
{
return;
}
int mid=(q[i].l+q[i].r)/2;
if(x<=mid)
update(x,y,val,i*2);
else
update(x,y,val,i*2+1);
}
int squery(int l,int r,int i,int k)
{
if(q[k].t[i].l==l&&q[k].t[i].r==r)
{
return q[k].t[i].sum;
}
int mid=(q[k].t[i].l+q[k].t[i].r)/2;
if(r<=mid)
return squery(l,r,i*2,k);
else if(l>mid)
return squery(l,r,i*2+1,k);
else
return squery(l,mid,i*2,k)+squery(mid+1,r,i*2+1,k);
}
int query(int l,int r,int ll,int rr,int i)
{
if(q[i].l==l&&q[i].r==r)
{
return squery(ll,rr,1,i);
}
int mid=(q[i].l+q[i].r)/2;
if(r<=mid)
return query(l,r,ll,rr,i*2);
else if(l>mid)
return query(l,r,ll,rr,i*2+1);
else
return query(l,mid,ll,rr,i*2)+query(mid+1,r,ll,rr,i*2+1);
}
int main(void)
{
int i,j,n,m,k;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
{
scanf("%d",&m);
build(0,m,0,m,1);
}
else if(n==1)
{
int x,y;
scanf("%d%d%d",&x,&y,&k);
update(x,y,k,1);
}
else if(n==2)
{
int x1,x2,y1,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
printf("%d\n",query(x1,x2,y1,y2,1));
}
else
break;
}
return 0;
}