rt,去掉Swap就不会re
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int f=1,res=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){res=(res<<1)+(res<<3)+(c^48);c=getchar();}
return res*f;
}
inline void write(int x)
{
if(x<0){putchar('-');x=-x;}
if(x>9)write(x/10);
putchar(x%10+'0');
}
const int mod=1e9+7;
struct node
{
int l,r;
mutable int val;
node(int l,int r=0,int val=0):l(l),r(r),val(val){}
bool operator<(const node &a)const
{
return l<a.l;
}
};
struct tmp
{
int l,r,val;
}tmp1[114514*3],tmp2[114514*3];
int cnt;
#define ittor set<node>::iterator
set<node>odt;
ittor split(int pos)
{
ittor it=odt.lower_bound(node(pos));
if(it!=odt.end()&&it->l==pos)
return it;
--it;
if(it->r<pos)
return odt.end();
int l=it->l;
int r=it->r;
int val=it->val;
odt.erase(it);
odt.insert(node(l,pos-1,val));
return odt.insert(node(pos,r,val)).first;
}
inline int sum(int l,int r)
{
ittor itr=split(r+1),itl=split(l);
int res=0;
for(ittor it=itl;it!=itr;it++)
res=(res+it->val*(it->r-it->l+1)%mod)%mod;
return res;
}
inline void assign(int l,int r,int x)
{
ittor itr=split(r+1),itl=split(l);
odt.erase(itl,itr);
odt.insert(node(l,r,x));
}
inline void add(int l,int r,int x)
{
ittor itr=split(r+1),itl=split(l);
for(ittor it=itl;it!=itr;it++)
it->val=(it->val+x)%mod;
}
inline void copy(int l1,int r1,int l2,int r2)
{
ittor itr=split(r1+1),itl=split(l1);
cnt=0;
for(ittor it=itl;it!=itr;it++)
{
tmp1[++cnt].l=it->l;
tmp1[cnt].r=it->r;
tmp1[cnt].val=it->val;
}
itr=split(r2+1),itl=split(l2);
odt.erase(itl,itr);
for(int i=1;i<=cnt;i++)
odt.insert(node(tmp1[i].l-l1+l2,tmp1[i].r-l1+l2,tmp1[i].val));
}
inline void Swap(int l1,int r1,int l2,int r2)
{
int len1=0,len2=0;
ittor itr=split(r1+1),itl=split(l1);
for(ittor it=itl;it!=itr;it++)
{
tmp1[++len1].l=it->l;
tmp1[len1].r=it->r;
tmp1[len1].val=it->val;
}
odt.erase(itl,itr);
itr=split(r2+1),itl=split(l2);
for(ittor it=itl;it!=itr;it++)
{
tmp2[++len2].l=it->l;
tmp2[len2].r=it->r;
tmp2[len2].val=it->val;
}
odt.erase(itl,itr);
for(int i=1;i<=len1;i++)
odt.insert(node(tmp2[i].l-l2+l1,tmp2[i].r-l2+l1,tmp2[i].val));
for(int i=1;i<=len1;i++)
odt.insert(node(tmp1[i].l-l1+l2,tmp1[i].r-l1+l2,tmp1[i].val));
}
inline void Reverse(int l,int r)
{
ittor itr=split(r+1),itl=split(l);
cnt=0;
for(ittor it=itl;it!=itr;it++)
{
tmp1[++cnt].l=it->l;
tmp1[cnt].r=it->r;
tmp1[cnt].val=it->val;
}
odt.erase(itl,itr);
for(int i=1;i<=cnt;i++)
odt.insert(node(r-tmp1[i].r+l,r-tmp1[i].l+l,tmp1[i].val));
}
int n,m;
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
{
int x=read();
odt.insert(node(i,i,x));
}
while(m--)
{
int op=read(),l1=read(),r1=read(),l2,r2,x;
if(op==1)
write(sum(l1,r1)),puts("");
else if(op==2)
x=read(),assign(l1,r1,x);
else if(op==3)
x=read(),add(l1,r1,x);
else if(op==4)
l2=read(),r2=read(),copy(l1,r1,l2,r2);
else if(op==5)
l2=read(),r2=read(),Swap(l1,r1,l2,r2);
else
Reverse(l1,r1);
}
ittor itr=split(n+1),itl=split(1);
for(ittor it=itl;it!=itr;it++)
for(int i=it->l;i<=it->r;i++)
write(it->val),putchar(' ');
}