区间修改+区间查询
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
const int MAXN=100000+10;
LL sum[MAXN<<2],Add[MAXN<<2];
LL A[MAXN];
int n,m,n1,x1,y1,k1;
void Pushup(int rt) { sum[rt]=sum[rt<<1]+sum[(rt<<1)|1]; }
void Pushdown(int rt,int ln,int rn)
{
if(Add[rt])
{
sum[rt<<1]+=Add[rt]*ln;
sum[(rt<<1)|1]+=Add[rt]*rn;
Add[rt<<1]+=Add[rt];
Add[(rt<<1)|1]+=Add[rt];
Add[rt]=0;
}
}
void build(int l,int r,int rt)
{
if(l==r)
{
sum[rt]=A[l];
return ;
}
int m=(l+r)>>1;
build(l,m,rt<<1);
build(m+1,r,(rt<<1)|1);
Pushup(rt);
}
void updata(int L,int R,int C,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
Add[rt]+=C;
sum[rt]+=C*(r-l+1);
return ;
}
int m=(l+r)>>1;
Pushdown(rt,m-l+1,r-m);
if(L<=m) updata(L,R,C,l,m,rt<<1);
if(R>m) updata(L,R,C,m+1,r,(rt<<1)|1);
Pushup(rt);
}
LL Query(int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
return sum[rt];
}
int m=(l+r)>>1;
Pushdown(rt,m-l+1,r-m);
LL ans=0;
if(L<=m) ans+=Query(L,R,l,m,rt<<1);
if(R>m) ans+=Query(L,R,m+1,r,(rt<<1)|1);
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&A[i]);
build(1,n,1);
for(int i=1;i<=m;i++)
{
scanf("%d",&n1);
if(n1==1)
{
scanf("%d%d%d",&x1,&y1,&k1);
updata(x1,y1,k1,1,n,1);
}
else {
scanf("%d%d",&x1,&y1);
printf("%lld\n",Query(x1,y1,1,n,1));
}
}
return 0;
}
单点修改+区间查询
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN=100000+10;
int sum[MAXN<<2];
int A[MAXN],n,m;
int num,x1,y1,k;
void Pushup(int rt) {sum[rt]=sum[rt<<1]+sum[(rt<<1)|1];}
void build(int l,int r,int rt)
{
if(l==r)
{
sum[rt]=A[l];
return ;
}
int m=(l+r)>>1;
build(l,m,rt<<1);
build(m+1,r,(rt<<1)|1);
Pushup(rt);
}
void updata(int L,int C,int l,int r,int rt)
{
if(l==r)
{
sum[rt]+=C;
return ;
}
int m=(l+r)>>1;
if(L<=m) updata(L,C,l,m,rt<<1);
else updata(L,C,m+1,r,(rt<<1)|1);
Pushup(rt);
}
int Query(int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
return sum[rt];
}
int m=(l+r)>>1;
int ans=0;
if(L<=m) ans+=Query(L,R,l,m,rt<<1);
if(R>m) ans+=Query(L,R,m+1,r,(rt<<1)|1);
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&A[i]);
build(1,n,1);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x1,&y1,&k);
if(x1==1) updata(y1,k,1,n,1);
else printf("%d\n",Query(y1,k,1,n,1));
}
return 0;
}