A Simple Problem with Integers
线段树区间修改,区间查询模板题
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <string>
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <stack>
#include <queue>
//#include<bits/stdc++.h>
using namespace std;
#define mod 1e9+7
#define inf 0x3f3f3f3f
const double PI = atan(1.0)*4.0;
typedef long long ll;
const int N=1e5+5;
struct tree
{
ll l,r,lz,val;
}node[4*N];
ll a[N];
void build(int now,int l,int r)
{ node[now].lz=0;
node[now].l=l;
node[now].r=r;
if(l==r)
{
node[now].val=a[l];
return ;
}
ll mid=(l+r)>>1;
build(now<<1,l,mid);
build(now<<1|1,mid+1,r);
node[now].val=node[now<<1].val+node[now<<1|1].val;
}
void pushdown(int now)
{ if(node[now].lz!=0)
{node[now<<1].lz+=node[now].lz;
node[now<<1|1].lz+=node[now].lz;
ll mid=(node[now].l+node[now].r)>>1;
node[now<<1].val+=node[now].lz*(mid-node[now].l+1);
node[now<<1|1].val+=node[now].lz*(node[now].r-mid);
node[now].lz=0;
}
return ;
}
void updata(int now,int l,int r,ll val)
{
if(node[now].l==l&&node[now].r==r)
{
node[now].val+=val*(r-l+1);
node[now].lz+=val;
return;
}
pushdown(now);
ll mid=(node[now].l+node[now].r)>>1;
if(l>mid)updata(now<<1|1,l,r,val);
else
if(r<=mid)updata(now<<1,l,r,val);
else
{
updata(now<<1,l,mid,val);
updata(now<<1|1,mid+1,r,val);
}
node[now].val=node[now<<1].val+node[now<<1|1].val;
}
ll query(int now,int l,int r)
{
if(node[now].l==l&&node[now].r==r)
{
return node[now].val;
}
pushdown(now);
ll mid=(node[now].l+node[now].r)>>1;
ll sum=0;
if(l>mid)sum+=query(now<<1|1,l,r);
else
if(r<=mid)sum+=query(now<<1,l,r);
else
{
sum+=query(now<<1,l,mid);
sum+=query(now<<1|1,mid+1,r);
}
return sum;
}
int main()
{ ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//freopen("E:\\in.txt","r",stdin);
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
for(int i=1;i<=k;i++)
{
char p;ll x,y,z;
cin>>p;
if(p=='Q')
{
cin>>x>>y;
ll sum=query(1,x,y);
cout<<sum<<endl;
}
else
{
cin>>x>>y>>z;
updata(1,x,y,z);
}
}
}