#include<iostream>
#include<set>
using namespace std;
int n,m,a[300005];
const int mod=1e9+7;
struct node
{
int l,r;
mutable int v;
bool operator<(const node &o)const
{
return l<o.l;
}
};
set<node>t;
auto split(int m)
{
auto it=t.upper_bound({m,0,0});
it--;
if(m==it->l)return it;
int l=it->l,r=it->r,v=it->v;
t.erase(it);
t.insert({l,m-1,v});
return t.insert({m,r,v}).first;
}
void assign(int l,int r,int v)
{
auto itr=split(r+1);
auto itl=split(l);
t.erase(itl,itr);
t.insert({l,r,v});
return;
}
void add(int l,int r,int v)
{
auto itr=split(r+1);
for(auto it=split(l);it!=itr;it++)
{
it->v+=v*(it->r-it->l+1);
it->v%=mod;
}
return;
}
node t1[300005],t2[300005];
void _swap(int l1,int r1,int l2,int r2)
{
auto itr1=split(r1+1);
auto itr2=split(r2+1);
auto itl1=split(l1);
auto itl2=split(l2);
int len1=0,len2=0;
for(auto it=itl1;it->r!=r1;it++)
{
t1[++len1]=*it;
}
for(auto it=itl2;it->r!=r2;it++)
{
t2[++len2]=*it;
}
t.erase(itl1,itr1);
t.erase(itl2,itr2);
for(int i=1;i<=len1;i++)t.insert({l2+t1[i].l-l1,l2+t1[i].r-l1,t1[i].v});
for(int i=1;i<=len2;i++)t.insert({l1+t2[i].l-l2,l1+t2[i].r-l2,t2[i].v});
return;
}
void copy(int l1,int r1,int l2,int r2)
{
auto itr2=split(r2+1);
auto itl2=split(l2);
t.erase(itl2,itr2);
auto itr1=split(r1+1);
auto itl1=split(l1);
for(auto it=itl1;it!=itr1;it++)
{
t.insert({l2+it->l-l1,l2+it->r-l1,it->v});
}
}
void _reverse(int l,int r)
{
auto itr=split(r+1);
auto itl=split(l);
int len=0;
for(auto it=itl;it->r!=r;it++)
{
t1[++len]=*it;
}
t.erase(itl,itr);
for(int i=len;i>=1;i--)
{
t.insert({l+r-t1[i].r,l+r-t1[i].l,t1[i].v});
}
return;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
t.insert({i,i,a[i]});
}
t.insert({n+1,n+1,0});
while(m--)
{
int flag;
scanf("%d",&flag);
if(flag==1)
{
int l,r;
scanf("%d%d",&l,&r);
long long ans=0;
auto itr=split(r+1);
for(auto it=split(l);it!=itr;it++)
{
ans+=it->v;
ans%=mod;
}
printf("%lld\n",ans);
}
else if(flag==2)
{
int l,r,v;
scanf("%d%d%d",&l,&r,&v);
assign(l,r,v);
}
else if(flag==3)
{
int l,r,v;
scanf("%d%d%d",&l,&r,&v);
add(l,r,v);
}
else if(flag==4)
{
int l1,r1,l2,r2;
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
copy(l1,r1,l2,r2);
}
else if(flag==5)
{
int l1,r1,l2,r2;
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
_swap(l1,r1,l2,r2);
}
else if(flag==6)
{
int l,r;
scanf("%d%d",&l,&r);
_reverse(l,r);
}
else
{
printf("终于写完珂朵莉了!!!");
}
}
for(auto it=t.begin();it!=t.end();it++)
{
for(int j=it->l;j<=it->r;j++)
{
printf("%d ",it->v);
}
}
}
提交记录