http://poj.org/problem?id=1195
简单二维线段树题。单点更新区间求和。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 #define lson l,m,rt<<1 5 #define rson m+1,r,rt<<1|1 6 #define maxn 1024 7 int n; 8 struct node 9 { 10 int setree1[maxn<<1]; 11 }setree[maxn<<1]; 12 void build1(int num,int l,int r,int rt) 13 { 14 setree[num].setree1[rt]=0; 15 if(l==r) 16 return; 17 int m=(l+r)>>1; 18 build1(num,lson); 19 build1(num,rson); 20 } 21 void build(int l,int r,int rt) 22 { 23 build1(rt,0,n-1,1); 24 if(l==r) 25 return; 26 int m=(l+r)>>1; 27 build(lson); 28 build(rson); 29 } 30 void update1(int num,int l,int r,int rt,int x,int c) 31 { 32 setree[num].setree1[rt]+=c; 33 if(l==r) 34 return; 35 int m=(l+r)>>1; 36 if(x<=m) 37 update1(num,lson,x,c); 38 else 39 update1(num,rson,x,c); 40 } 41 void update(int l,int r,int rt,int x,int y,int c) 42 { 43 update1(rt,0,n-1,1,y,c); 44 if(l==r) 45 return; 46 int m=(l+r)>>1; 47 if(x<=m) 48 update(lson,x,y,c); 49 else 50 update(rson,x,y,c); 51 } 52 int query1(int num,int l,int r,int rt,int L,int R) 53 { 54 if(L<=l&&r<=R) 55 return setree[num].setree1[rt]; 56 int m=(l+r)>>1; 57 int ans=0; 58 if(L<=m) 59 ans+=query1(num,lson,L,R); 60 if(R>m) 61 ans+=query1(num,rson,L,R); 62 return ans; 63 } 64 int query(int l,int r,int rt,int L,int R,int LL,int RR) 65 { 66 if(L<=l&&r<=R) 67 return query1(rt,0,n-1,1,LL,RR); 68 int m=(l+r)>>1; 69 int ans=0; 70 if(L<=m) 71 ans+=query(lson,L,R,LL,RR); 72 if(R>m) 73 ans+=query(rson,L,R,LL,RR); 74 return ans; 75 } 76 int main() 77 { 78 int op; 79 while(scanf("%d",&op)&&op!=3){ 80 if(op==0){ 81 scanf("%d",&n); 82 build(0,n-1,1); 83 } 84 else if(op==1){ 85 int x,y,c; 86 scanf("%d%d%d",&x,&y,&c); 87 update(0,n-1,1,x,y,c); 88 } 89 else{ 90 int l,r,b,t; 91 scanf("%d%d%d%d",&l,&b,&r,&t); 92 printf("%d\n",query(0,n-1,1,l,r,b,t)); 93 } 94 } 95 return 0; 96 }