题目链接:https://www.luogu.org/problemnew/show/P3368
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int n,m; 6 int tree[500070],a[500070]; 7 int lowbit(int x) 8 { 9 return x&-x; 10 } 11 void add(int k,int num)//给k位置的数值加num 12 { 13 while(k<=n) 14 { 15 tree[k]+=num; 16 k+=lowbit(k); 17 } 18 } 19 int query(int x) 20 { 21 int sum=0; 22 for(int i=x;i>0;i-=i&(-i)) sum+=tree[i]; 23 return sum; 24 } 25 26 int main() 27 { 28 cin>>n>>m; 29 for(int i=1;i<=n;i++) cin>>a[i]; 30 while(m--) 31 { 32 int k; 33 cin>>k; 34 if(k==1) 35 { 36 int x,y,z; 37 cin>>x>>y>>z; 38 add(x,z); //维护查分数组 39 add(y+1,-z); 40 } 41 else 42 { 43 int x; 44 cin>>x; 45 cout<<a[x]+query(x)<<endl; //query()求的是改变的值,再加上原来的值就可以了 46 } 47 } 48 return 0; 49 }