标签:
题目描述 Description
给你N个数,有两种操作
1:给区间[a,b]的所有数都增加X
2:询问第i个数是什么?
第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,表示操作的个数. 接下来Q行每行若干个整数。如果第一个数是1,后接3个正整数a,b,X,表示在区间[a,b]内每个数增加X,如果是2,后面跟1个整数i, 表示询问第i个位置的数是多少。
对于每个询问输出一行一个答案
3
1
2
3
2
1 2 3 2
2 3
5
数据范围
1<=n<=100000
1<=q<=100000
1 //code by drizzle 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<algorithm> 6 #include<vector> 7 #define ll __int64 8 #define PI acos(-1.0) 9 #define mod 1000000007 10 using namespace std; 11 struct node 12 { 13 int l,r,value; 14 }tree[400005]; 15 void buildtree(int root,int left,int right) 16 { 17 tree[root].l=left; 18 tree[root].r=right; 19 if(left==right) 20 { 21 scanf("%d",&tree[root].value); 22 return ; 23 } 24 int mid=(left+right)>>1; 25 buildtree(root<<1,left,mid); 26 buildtree(root<<1|1,mid+1,right); 27 tree[root].value=tree[root<<1].value+tree[root<<1|1].value; 28 } 29 void updata(int c,int left,int right,int root) 30 { 31 if(tree[root].l==left&&tree[root].r==right&&left==right) 32 { 33 tree[root].value+=c; 34 return; 35 } 36 int mid=(tree[root].l+tree[root].r)>>1; 37 if(right<=mid) 38 updata(c,left,right,root<<1); 39 else 40 { 41 if(left>mid) 42 updata(c,left,right,root<<1|1); 43 else 44 { 45 updata(c,left,mid,root<<1); 46 updata(c,mid+1,right,root<<1|1); 47 } 48 } 49 tree[root].value=tree[root<<1].value+tree[root<<1|1].value; 50 } 51 int query(int left ,int right,int root) 52 { 53 if(tree[root].l==left&&tree[root].r==right) 54 { 55 return tree[root].value; 56 } 57 int mid=(tree[root].l+tree[root].r)>>1; 58 if(right<=mid) 59 return query(left,right,root<<1); 60 else 61 { 62 if(left>mid) 63 return query(left,right,root<<1|1); 64 else 65 return query(left,mid,root<<1)+query(mid+1,right,root<<1|1); 66 } 67 } 68 int n; 69 int exm; 70 int q; 71 int flag; 72 int lll,rrr,add; 73 int cha; 74 int main() 75 { 76 while(scanf("%d",&n)!=EOF) 77 { 78 buildtree(1,1,n); 79 scanf("%d",&q); 80 for(int i=1;i<=q;i++) 81 { 82 scanf("%d",&flag); 83 if(flag==1) 84 { 85 scanf("%d %d %d",&lll,&rrr,&add); 86 updata(add,lll,rrr,1); 87 } 88 if(flag==2) 89 { 90 scanf("%d",&cha); 91 printf("%d\n",query(cha,cha,1)); 92 } 93 } 94 } 95 return 0; 96 }
codevs 1081 线段树练习 2 区间更新 单点查询 无lazy
标签:
原文地址:http://www.cnblogs.com/hsd-/p/5691506.html