0 0 在刷DP的我不知道为什么点开了一个线段树呢。。。真神奇。。然而一定是输错了题号。。但是蛮做吧,还是有点忘了的。。
比如说在add的时候忘了给路过的区间更新QAQ
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
using namespace std;
#define maxn 100100
#define llt long long
llt ans;
llt tree[maxn<<2],vis[maxn<<2];
void create(int l,int r,int root)
{
vis[root]=0;
if(l==r)
{
scanf("%lld",&tree[root]);
return;
}
int mid=(l+r)>>1;
create(l,mid,root<<1);
create(mid+1,r,root<<1|1);
tree[root]=tree[root<<1]+tree[root<<1|1];
}
void add(int ll,int rr,int l,int r,int root,llt x)
{
if(ll==l&&rr==r)
{
vis[root]+=x;
return;
}
tree[root]+=(rr-ll+1)*x;
int mid=(l+r)>>1;
if(rr<=mid) add(ll,rr,l,mid,root<<1,x);
else if(ll>mid) add(ll,rr,mid+1,r,root<<1|1,x);
else add(ll,mid,l,mid,root<<1,x),add(mid+1,rr,mid+1,r,root<<1|1,x);
}
void query(int ll,int rr,int l,int r,int root)
{
if(vis[root])
{
tree[root]+=vis[root]*(r-l+1);
if(l!=r) vis[root<<1]+=vis[root],vis[root<<1|1]+=vis[root];
vis[root]=0;
}
if(ll==l&&rr==r)
{
ans+=tree[root];
return;
}
int mid=(l+r)>>1;
if(rr<=mid) query(ll,rr,l,mid,root<<1);
else if(ll>mid) query(ll,rr,mid+1,r,root<<1|1);
else query(ll,mid,l,mid,root<<1),query(mid+1,rr,mid+1,r,root<<1|1);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
create(1,n,1);
while(m--)
{
char op[10];
scanf("%s",op);
int ll,rr;
llt x;
if(op[0]=='C')
{
scanf("%d%d%lld",&ll,&rr,&x);
add(ll,rr,1,n,1,x);
}
else if(op[0]=='Q')
{
scanf("%d%d",&ll,&rr);
ans=0;
query(ll,rr,1,n,1);
printf("%lld\n",ans);
}
}
}
return 0;
}