有点奇怪,空间也就开了 10+MB 怎么会 MLE 呢 /yun
#include<map>
#include<set>
#include<queue>
#include<deque>
#include<stack>
#include<ctime>
#include<cmath>
#include<cctype>
#include<bitset>
#include<vector>
#include<cstdio>
#include<random>
#include<climits>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x3f3f3f3f
#define INF 1e9
#define LLINF 1e18
#define ll long long
#define N 300005
#define Mod 1000000007
#define ls(p) node[p].ls
#define rs(p) node[p].rs
using namespace std;
int read(){
int x=0,f=1,ch=getchar();
for(;!isdigit(ch);ch=getchar()) f=(ch=='-')?-1:1;
for(;isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
return x*f;
}
void print(int x){
if(x<0) putchar('-'),x=~(x-1);
if(x>9) print(x/10);
putchar(x%10+48);
}
//bool st;
int n,m,rt,tot,lst;
struct FHQ{
int ls,rs;
int Size,key;
int sum,val;
bool rev;int cov,tag;
}node[N];
int New(int d){
node[++tot]=(FHQ){0,0,1,rand(),d,d,0,-1,0};
return tot;
}
void getnew(int p){
node[p].Size=node[ls(p)].Size+node[rs(p)].Size+1;
node[p].sum=node[ls(p)].sum+node[rs(p)].sum+node[p].val;
}
void spread(int p){
if(~node[p].cov){
if(ls(p)){
node[ls(p)].cov=node[ls(p)].val=node[p].cov;
node[ls(p)].sum=((ll)node[ls(p)].Size*node[p].cov)%Mod;
node[ls(p)].tag=0;
}
if(rs(p)){
node[rs(p)].cov=node[rs(p)].val=node[p].cov;
node[rs(p)].sum=((ll)node[rs(p)].Size*node[p].cov)%Mod;
node[rs(p)].tag=0;
}
node[p].cov=-1;
}
if(node[p].tag){
if(ls(p)){
node[ls(p)].val=((ll)node[ls(p)].val+node[p].tag)%Mod;
node[ls(p)].tag=((ll)node[ls(p)].tag+node[p].tag)%Mod;
node[ls(p)].sum=((ll)node[ls(p)].sum+(ll)node[ls(p)].Size*node[p].tag)%Mod;
}
if(rs(p)){
node[rs(p)].val=((ll)node[rs(p)].val+node[p].tag)%Mod;
node[rs(p)].tag=((ll)node[rs(p)].tag+node[p].tag)%Mod;
node[rs(p)].sum=((ll)node[rs(p)].sum+(ll)node[rs(p)].Size*node[p].tag)%Mod;
}
node[p].tag=0;
}
if(node[p].rev){
if(ls(p)){
swap(ls(ls(p)),rs(ls(p)));
node[ls(p)].rev^=1;
}
if(rs(p)){
swap(ls(rs(p)),rs(rs(p)));
node[rs(p)].rev^=1;
}
node[p].rev=0;
}
}
void split(int p,int k,int &x,int &y){
if(!p){
x=y=0;
return;
}
spread(p);
if(node[ls(p)].Size<k){
x=p;
split(rs(p),k-node[ls(p)].Size-1,rs(p),y);
getnew(x);
}
else{
y=p;
split(ls(p),k,x,ls(p));
getnew(y);
}
}
int merge(int x,int y){
if(!x || !y) return x+y;
if(node[x].key>node[y].key){
spread(x);
rs(x)=merge(rs(x),y);
getnew(x);return x;
}
else{
spread(y);
ls(y)=merge(x,ls(y));
getnew(y);return y;
}
}
int query(int l,int r){
int x,y,z;
split(rt,l-1,x,y);
split(y,r-l+1,y,z);
int res=node[y].sum;
rt=merge(merge(x,y),z);
return res;
}
void cover(int l,int r,int d){
int x,y,z;
split(rt,l-1,x,y);
split(y,r-l+1,y,z);
node[y].val=node[y].cov=d,node[y].tag=0;
node[y].sum=((ll)node[y].Size*d)%Mod;
rt=merge(merge(x,y),z);
}
void change(int l,int r,int d){
int x,y,z;
split(rt,l-1,x,y);
split(y,r-l+1,y,z);
node[y].val=((ll)node[y].val+d)%Mod;
node[y].tag=((ll)node[y].tag+d)%Mod;
node[y].sum=((ll)node[y].sum+(ll)node[y].Size*d)%Mod;
rt=merge(merge(x,y),z);
}
void copy(int l1,int r1,int l2,int r2){
int x1,y1,z1;
split(rt,l1-1,x1,y1);
split(y1,r1-l1+1,y1,z1);
node[++tot]=node[y1];
rt=merge(merge(x1,y1),z1);
int x2,y2,z2;
split(rt,l2-1,x2,y2);
split(y2,r2-l2+1,y2,z2);
rt=merge(merge(x2,tot),z2);
}
void Swap(int l1,int r1,int l2,int r2){
if(r2<l1) swap(l1,l2),swap(r1,r2);
int a,b,c,d,e;
split(rt,r2,d,e);
split(d,l2-1,c,d);
split(c,r1,b,c);
split(b,l1-1,a,b);
rt=merge(merge(merge(merge(a,d),c),b),e);
}
void rever(int l,int r){
int x,y,z;
split(rt,l-1,x,y);
split(y,r-l+1,y,z);
swap(ls(y),rs(y)),node[y].rev^=1;
rt=merge(merge(x,y),z);
}
void Print(int p){
if(!p) return;
spread(p);
Print(ls(p));
printf("%d ",node[p].val);
Print(rs(p));
}
int main(){
// bool ed;
srand(time(NULL));
n=read(),m=read();
for(int i=1;i<=n;++i) rt=merge(rt,New(read()));
while(m--){
int op=read();
if(op==1){
int l=read()^lst,r=read()^lst;
printf("%d\n",query(l,r));
}
if(op==2){
int l=read()^lst,r=read()^lst,d=read()^lst;
cover(l,r,d);
}
if(op==3){
int l=read()^lst,r=read()^lst,d=read()^lst;
change(l,r,d);
}
if(op==4){
int l1=read()^lst,r1=read()^lst,l2=read()^lst,r2=read()^lst;
copy(l1,r1,l2,r2);
}
if(op==5){
int l1=read()^lst,r1=read()^lst,l2=read()^lst,r2=read()^lst;
Swap(l1,r1,l2,r2);
}
if(op==6){
int l=read()^lst,r=read()^lst;
rever(l,r);
}
}
Print(rt);
// cerr<<(double)(&ed-&st)/1024.0/1024.0;
return 0;
}