hdu 1166 线段树单点更新
等线段树复习完再做个总结
1
10
1 2 3 4 5 6 7 8 9 10
Query 1 3
Add 3 6
Query 2 7
Sub 10 2
Add 6 3
Query 3 10
End
Case 1:
6
33
59
2015-05-15:
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f3f3f3f; 11 const double eps=1e-5; 12 #define cl(a) memset(a,0,sizeof(a)) 13 #define ts printf("*****\n"); 14 #define lson l,mid,rt<<1 15 #define rson mid+1,r,rt<<1|1 16 #define root 1,n,1 17 #define mid ((l+r)>>1) 18 const int MAXN=60000; 19 int n,m,t; 20 int num[MAXN]; 21 struct Node 22 { 23 int l,r; 24 int sum; 25 }node[MAXN<<2]; 26 void build(int l,int r,int rt) 27 { 28 node[rt].l=l; 29 node[rt].r=r; 30 if(l==r) 31 { 32 node[rt].sum=num[l]; 33 return; 34 } 35 build(lson); 36 build(rson); 37 node[rt].sum=node[rt<<1|1].sum+node[rt<<1].sum; 38 } 39 void update(int p,int val,int l,int r,int rt) 40 { 41 if(l==r) 42 { 43 node[rt].sum+=val; 44 return; 45 } 46 if(p<=mid) update(p,val,lson); 47 else update(p,val,rson); 48 node[rt].sum=node[rt<<1|1].sum+node[rt<<1].sum; 49 } 50 int query(int L,int R,int l,int r,int rt) 51 { 52 if(l>=L&&r<=R) 53 { 54 return node[rt].sum; 55 } 56 int ret=0; 57 if(L<=mid) ret+=query(L,R,lson); 58 if(R>mid) ret+=query(L,R,rson); 59 return ret; 60 } 61 int main() 62 { 63 int i,j,k,tt; 64 #ifndef ONLINE_JUDGE 65 freopen("1.in","r",stdin); 66 #endif 67 scanf("%d",&tt); 68 int ca=1; 69 while(tt--) 70 { 71 scanf("%d",&n); 72 for(i=1;i<=n;i++) 73 { 74 scanf("%d",num+i); 75 } 76 build(root); 77 char s[100]; 78 int l,r,po,v; 79 printf("Case %d:\n",ca++); 80 while(scanf("%s",s)) 81 { 82 if(s[0]=='E') break; 83 if(s[0]=='Q') 84 { 85 scanf("%d%d",&l,&r); 86 printf("%d\n",query(l,r,root)); 87 } 88 if(s[0]=='S') 89 { 90 scanf("%d%d",&po,&v); 91 update(po,-v,root); 92 } 93 if(s[0]=='A') 94 { 95 scanf("%d%d",&po,&v); 96 update(po,v,root); 97 } 98 } 99 } 100 101 }
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f3f3f3f; 11 const double eps=1e-5; 12 #define cl(a) memset(a,0,sizeof(a)) 13 #define ts printf("*****\n"); 14 #define lson l,mid,rt<<1 15 #define rson mid+1,r,rt<<1|1 16 #define root 1,n,1 17 #define mid ((l+r)>>1) 18 const int MAXN=60000; 19 int n,m,t; 20 int sum[MAXN<<4]; 21 void pushup(int rt) 22 { 23 sum[rt]=sum[rt<<1]+sum[rt<<1|1]; 24 } 25 void build(int l,int r,int rt) 26 { 27 if(l==r) 28 { 29 scanf("%d",&sum[rt]); 30 return; 31 } 32 build(lson); 33 build(rson); 34 pushup(rt); 35 } 36 void update(int pos,int val,int l,int r,int rt) 37 { 38 if(l==r) 39 { 40 sum[rt]+=val; 41 return; 42 } 43 if(pos<=mid) update(pos,val,lson); 44 else update(pos,val,rson); 45 pushup(rt); 46 } 47 int query(int L,int R,int l,int r,int rt) 48 { 49 if(l>=L&&r<=R) 50 { 51 return sum[rt]; 52 } 53 int ans=0; 54 if(L<=mid) ans+=query(L,R,lson); 55 if(R>mid) ans+=query(L,R,rson); 56 return ans; 57 } 58 int main() 59 { 60 int i,j,k,tt; 61 #ifndef ONLINE_JUDGE 62 freopen("1.in","r",stdin); 63 #endif 64 scanf("%d",&tt); 65 int ca=1; 66 while(tt--) 67 { 68 scanf("%d",&n); 69 printf("Case %d:\n",ca++); 70 build(root); 71 char s[10]; 72 int p,v; 73 while(1) 74 { 75 scanf("%s",s); 76 if(s[0]=='E') break; 77 scanf("%d%d",&p,&v); 78 if(s[0]=='A') update(p,v,1,n,1); 79 else if(s[0]=='S') update(p,-v,1,n,1); 80 else if(s[0]=='Q') printf("%d\n",query(p,v,1,n,1)); 81 } 82 } 83 }