以区间求和为例
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define re register
#define inl inline
#define LL long long
const int MAXN=5e5+5;
LL a[MAXN],sum[4*MAXN];//一定要乘4
LL n,m,ans;
inl void BUD(LL num,LL l,LL r)
{
if(l==r)
{
sum[num]=a[l];
return;
}
LL mid=(l+r)/2;
BUD(num*2,l,mid);
BUD(num*2+1,mid+1,r);
sum[num]=sum[num*2]+sum[num*2+1];
}
inl void CG(LL num,LL l,LL r,LL x,LL t)
{
if(x<l||x>r) return;
if(l==r&&l==x)
{
sum[num]+=t;
return;
}
LL mid=(l+r)>>1;
CG(num*2,l,mid,x,t);
CG(num*2+1,mid+1,r,x,t);
sum[num]=sum[num*2]+sum[num*2+1];
}
inl LL SUM(LL num,LL l,LL r,LL x,LL y)
{
LL mid,res;
if(y<l||x>r) return 0;
if(x<=l&&y>=r) return sum[num];
mid=(l+r)>>1;
res=SUM(num*2,l,mid,x,y)+SUM(num*2+1,mid+1,r,x,y);
return res;
}
int main()
{
LL ty,x,y;
scanf("%lld%lld",&n,&m);
for(re LL i=1;i<=n;i++)
scanf("%lld",&a[i]);
BUD(1,1,n);
while(m--)
{
scanf("%lld%lld%lld",&ty,&x,&y);
if(ty==1) CG(1,1,n,x,y);
else printf("%lld\n",SUM(1,1,n,x,y));
}
return 0;
}