可以过样例。
代码:
#include<bits/stdc++.h>
#define tp_rt Tree.root
#define INF 2147483647
using namespace std;
const int N=1e6+7;
int n,q;
struct FHQ_treap
{
int lson,rson,siz,rnd,val,sum;
int add;
}tree[N];
struct FHQ_TREAP
{
int cnt;
int root;
inline void change(int x)
{
tree[x].siz=tree[tree[x].lson].siz+tree[tree[x].rson].siz+1;
tree[x].sum=tree[x].val;
if(tree[x].lson) tree[x].sum+=tree[tree[x].lson].sum;
if(tree[x].rson) tree[x].sum+=tree[tree[x].rson].sum;
}
inline void down(int x)
{
if(tree[x].add!=0)
{
if(tree[x].lson)
{
tree[tree[x].lson].add+=tree[x].add;
tree[tree[x].lson].val+=tree[x].add;
tree[tree[x].lson].sum+=tree[x].add;
}
if(tree[x].rson)
{
tree[tree[x].rson].add+=tree[x].add;
tree[tree[x].rson].val+=tree[x].add;
tree[tree[x].rson].sum+=tree[x].add;
}
tree[x].add=0;
change(x);
}
}
inline void split_siz(int now,int key,int &x,int &y)
{
if(!now)
{
x=y=0;
return;
}
down(now);
if(tree[tree[now].lson].siz<key)
{
x=now;
split_siz(tree[now].rson,key-1-tree[tree[now].lson].siz,tree[now].rson,y);
}
else
{
y=now;
split_siz(tree[now].lson,key,x,tree[now].lson);
}
change(now);
}
inline int merge(int x,int y)
{
if(!x||!y) return x|y;
if(tree[x].rnd<tree[y].rnd)
{
down(x);
tree[x].rson=merge(tree[x].rson,y);
change(x);
return x;
}
down(y);
tree[y].lson=merge(x,tree[y].lson);
change(y);
return y;
}
inline int join(int x)
{
tree[++cnt].rnd=rand();
tree[cnt].siz=1;
tree[cnt].val=x;
tree[cnt].sum=x;
return cnt;
}
inline void ins(int &rt,int x)
{
rt=merge(rt,join(x));
}
inline void update(int &rt,int l,int r,int x)
{
int r1=0,r2=0,r3=0;
split_siz(rt,l-1,r1,r2);
split_siz(r2,r-l+1,r2,r3);
tree[r2].add+=x;
tree[r2].sum+=x;
tree[r2].val+=x;
rt=merge(r1,merge(r2,r3));
}
inline void query(int &rt,int l,int r)
{
int r1=0,r2=0,r3=0;
split_siz(rt,l-1,r1,r2);
split_siz(r2,r-l+1,r2,r3);
printf("%d\n",tree[r2].sum);
rt=merge(r1,merge(r2,r3));
}
}Tree;
int main()
{
srand(time(NULL));
scanf("%d %d",&n,&q);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
Tree.ins(tp_rt,x);
}
while(q--)
{
int opt,x,y,z;
scanf("%d %d %d",&opt,&x,&y);
if(opt==1)
{
scanf("%d",&z);
Tree.update(tp_rt,x,y,z);
}
// if(opt==1)
// {
// Tree.tolate(tp_rt,x,y);
// }
else if(opt==2)
{
Tree.query(tp_rt,x,y);
}
}
}