记得写过线段树含lazy,这个就是小儿科了,就只奉上代码啦~ ^0^
#include<cstdio> using namespace std; #define ll long long const int maxn=5e5+5; int l[4*maxn],r[4*maxn]; ll sum[4*maxn]; void build(int L,int R,int now) { l[now]=L; r[now]=R; if(L==R) { scanf("%lld",&sum[now]); return ; } int mid=(L+R)/2; build(L,mid,now*2); build(mid+1,R,now*2+1); sum[now]=sum[now*2]+sum[now*2+1]; } ll query(int L,int R,int now) { if(L==l[now]&&R==r[now]) return sum[now]; int mid=(l[now]+r[now])/2; if(R<=mid) return query(L,R,now*2); else if(L>mid) return query(L,R,now*2+1); else return query(L,mid,now*2)+query(mid+1,R,now*2+1); } void update(int idx,int d,int now) { if(l[now]==r[now]) { sum[now]+=d; return ; } int mid=(l[now]+r[now])/2; if(idx<=mid) update(idx,d,now*2); else update(idx,d,now*2+1); sum[now]=sum[now*2]+sum[now*2+1]; } int main() { int n,q; scanf("%d%d",&n,&q); build(1,n,1); while(q--) { int op,a,b; scanf("%d%d%d",&op,&a,&b); if(op==1) update(a,b,1); else printf("%lld ",query(a,b,1)); } return 0; }