全 MLE 了……
#include<set>
#include<math.h>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<valarray>
#include<algorithm>
#define N 300005
#define Mod 1000000007
namespace FastIO{
inline void read(int &x){
x=0; char ch=getchar(); bool f=1;
while(ch<'0'||ch>'9') f^=(ch=='-'),ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x=f?x:-x; return;
}
inline void put(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) put(x/10);
putchar(x%10+'0');
}
inline void write(int x,char ch='\n'){
put(x); putchar(ch); return;
}
}
using FastIO::read;
using FastIO::write;
inline void gmin(int &a,int b){a=a<b?a:b;}
inline void gmax(int &a,int b){a=a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
inline int max(int a,int b){return a>b?a:b;}
struct Chtholly{
int l,r; mutable int v;
inline bool operator <(
const Chtholly &o
) const {return l<o.l;}
Chtholly(int L,int R,int V)
: l(L),r(R),v(V) {}
};
struct ODT{
std::set<Chtholly> s;
#define it std::set<Chtholly>::iterator
inline it split(int p){
auto pos=s.lower_bound(Chtholly(p,-1,0));
if(pos!=s.end()&&pos->l==p)
return pos; --pos;
int l=pos->l,r=pos->r,v=pos->v;
s.erase(pos),s.insert(Chtholly(l,p-1,v));
return s.insert(Chtholly(p,r,v)).first;
}
inline void assign(int l,int r,int v){
auto rpos=split(r+1),lpos=split(l);
s.erase(lpos,rpos),s.insert({l,r,v});
}
inline void add(int l,int r,int v){
auto rpos=split(r+1),lpos=split(l);
for(;lpos!=rpos;++lpos) (lpos->v+=v)%=Mod;
}
inline void copy(int l1,int r1,int l2,int r2){
auto rpos1=split(r1+1),lpos1=split(l1);
std::vector<Chtholly> vec;
for(;lpos1!=rpos1;++lpos1)
vec.push_back(*lpos1);
auto rpos2=split(r2+1),lpos2=split(l2);
s.erase(lpos2,rpos2);
for(auto [L,R,V]:vec)
s.insert(Chtholly(L+l2-l1,R+l2-l1,V));
}
inline void swap(int l1,int r1,int l2,int r2){
auto rpos1=split(r1+1),lpos1=split(l1);
auto rpos2=split(r2+1),lpos2=split(l2);
std::vector<Chtholly> vec1,vec2;
for(;lpos1!=rpos1;++lpos1) vec1.push_back(*lpos1);
for(;lpos2!=rpos2;++lpos2) vec2.push_back(*lpos2);
for(auto now:vec2) s.erase(now);
for(auto [L,R,V]:vec1)
s.insert(Chtholly(L+l2-l1,R+l2-l1,V));
for(auto now:vec1) s.erase(now);
for(auto [L,R,V]:vec2)
s.insert(Chtholly(L+l1-l2,R+l1-l2,V));
}
inline void reverse(int l,int r){
auto rpos=split(r+1),lpos=split(l);
std::vector<Chtholly> vec;
auto lin=lpos;
for(;lpos!=rpos;++lpos)
vec.push_back(*lpos);
for(auto now:vec) s.erase(now);
for(auto [L,R,V]:vec)
s.insert(Chtholly(r-R+l,r-L+l,V));
}
inline int len(it pos){
return pos->r-pos->l+1;
}
inline int sum(int l,int r){
auto rpos=split(r+1),lpos=split(l);
int res=0; for(; lpos!=rpos;++lpos)
(res+=lpos->v*len(lpos)%Mod)%=Mod;
return res;
}
inline void insert(int l,int r,int v){
s.insert(Chtholly(l,r,v));
}
}odt;
int n,q,a[N];
signed main(){
read(n),read(q);
for(int i=1;i<=n;++i)
read(a[i]);
for(int i=1;i<=n;++i)
odt.insert(i,i,a[i]);
odt.insert(n+1,n+1,0);
int l1=0,r1=0,l2=0,r2,v;
int opt,l,r; while(q--){
read(opt); switch (opt){
case 1: read(l),read(r),write(odt.sum(l,r)); break;
case 2: read(l),read(r),read(v),odt.assign(l,r,v); break;
case 3: read(l),read(r),read(v),odt.add(l,r,v); break;
case 4: read(l1),read(r1),read(l2),read(r2),odt.copy(l1,r1,l2,r2); break;
case 5: read(l1),read(r1),read(l2),read(r2),odt.swap(l1,r1,l2,r2); break;
case 6: read(l),read(r),odt.reverse(l,r); break;
}
// for(int i=1;i<=n;++i) write(odt.sum(i,i),' '); putchar('\n');
} for(int i=1;i<=n;++i) write(odt.sum(i,i),' ');
// system("pause");
}
}