#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
#define int long long
#define endl puts("")
#define ed putchar(' ')
using namespace std;
const int mod=1e9+7;
char eof_flag;inline char read(int*s){if(eof_flag)return 0;int k=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9')){if(c==EOF){eof_flag=1;return 0;}c=getchar();}f=(c=='-')?-1:1;k=(c=='-')?0:(c^48);c=getchar();while(c>='0'&&c<='9')k=(k<<1)+(k<<3)+(c^48),c=getchar();if(c==EOF)eof_flag=1;(*s)=f>0?k:-k;return 1;}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+'0');return;}
struct node
{
int l,r;
mutable int val;
node (int l,int r=-1,int val=0) : l (l),r (r),val (val) {}
bool operator <(const node &x) const {return l<x.l;}
};
set<node> s;
struct Chtholly_Tree
{
inline auto split(int pos)
{
auto it=s.lower_bound(node(pos));
if (it!=s.end() and it->l==pos) return it;
it--;
if (it->r<pos) return s.end();
int l=it->l,r=it->r,val=it->val;
s.erase(it);
s.insert(node(l,pos-1,val));
return s.insert(node(pos,r,val)).first;
}
inline void assign(int l,int r,int val)
{
auto itr=split(r+1),itl=split(l);
s.erase(itl,itr);
s.insert(node(l,r,val));
return ;
}
inline int query(int l,int r)
{
auto itr=split(r+1),itl=split(l);
int ans=0;
while(itl!=itr)
{
ans=(ans+((itl->r)-(itl->l)+1)*(itl->val))%mod;
itl++;
}
return ans;
}
inline void add(int l,int r,int val)
{
val%=mod;
auto itr=split(r+1),itl=split(l);
while (itl!=itr) itl->val+=(itl->r-itl->l+1)*val,itl->val%=mod,itl++;
return ;
}
inline void copy(int l1,int r1,int l2,int r2)
{
int w=l2-l1;
vector<node> e;
auto itr1=split(r1+1),itl1=split(l1);
for (auto it=itl1;it!=itr1;it++) e.push_back({it->l+w,it->r+w,it->val});
auto itr2=split(r2+1),itl2=split(l2);
s.erase(itl2,itr2);
for (auto v : e) s.insert(node(v.l,v.r,v.val));
return ;
}
inline void reverse(int l,int r)
{
auto itr=split(r+1),itl=split(l);
auto a=itl,b=itr;
vector<node> e;
while (itl!=itr) e.push_back({l+r-(itl->r),l+r-(itl->l),itl->val}),itl++;
s.erase(a,b);
for (auto v : e) s.insert(node(v.l,v.r,v.val));
return ;
}
inline void range_swap(int l1,int r1,int l2,int r2)
{
if (l1>l2) swap(l1,l2),swap(r1,r2);
int w=l2-l1;
vector<node> e1,e2;
auto itr1=split(r1+1),itl1=split(l1);
for (auto it=itl1;it!=itr1;it++) e1.push_back({it->l+w,it->r+w,it->val});
s.erase(itl1,itr1);
auto itr2=split(r2+1),itl2=split(l2);
for (auto it=itl2;it!=itr2;it++) e2.push_back({it->l-w,it->r-w,it->val});
s.erase(itl2,itr2);
for (auto v : e1) s.insert(node(v.l,v.r,v.val));
for (auto v : e2) s.insert(node(v.l,v.r,v.val));
return ;
}
}tr;
int n,m;
signed main()
{
read(&n),read(&m);
for (register int i=1;i<=n;i++)
{
int x;
read(&x),x%=mod;
s.insert(node(i,i,x));
}
s.insert({n+1,n+1,114514});
while (m--)
{
int op,l1,r1,l2,r2,val;
read(&op),read(&l1),read(&r1);
if (op==1) write(tr.query(l1,r1)),endl;
if (op==2) read(&val),val%=mod,tr.assign(l1,r1,val);
if (op==3) read(&val),val%=mod,tr.add(l1,r1,val);
if (op==4) read(&l2),read(&r2),tr.copy(l1,r1,l2,r2);
if (op==5) read(&l2),read(&r2),tr.range_swap(l1,r1,l2,r2);
if (op==6) tr.reverse(l1,r1);
}
auto itr=tr.split(n+1),itl=tr.split(1);
while (itl!=itr)
{
for (register int i=1;i<=(itl->r-itl->l+1);i++)
write((itl->val)%mod),ed;
itl++;
}
return 0;
}
看了一下,感觉可能是取模取挂了,但是不知道挂在哪儿了。