还是板子。区间更新,树状数组结合差分。
#include<bits/stdc++.h> using namespace std; const int maxn=5*1e5+5; vector<int>a(maxn); vector<int>b(maxn); vector<int>v(maxn); int n,m,x,y,k,op; int lowbit(int x){ return x&(-x); } int add(int x,int y){ while(x<=n){ v[x]+=y; x+=lowbit(x); } } int sum(int x){ int sum=0; while(x!=0){ sum+=v[x]; x-=lowbit(x); } return sum; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); if(i==1){ add(i,a[i]); } else{ add(i,a[i]-a[i-1]); } } for(int i=1;i<=m;i++){ scanf("%d",&op); if(op==1){ scanf("%d%d%d",&x,&y,&k);///[x,y]每个数加k add(x,k);///差分数组,只需要改x和y+1这两个数,用树状数组维护 add(y+1,-k); } else{ scanf("%d",&x); cout<<sum(x)<<endl; } } return 0; }