调了一整天了,还是寄
#include <iostream>
#include <set>
#include <vector>
using namespace std;
using ll=long long;
ll n,m;
constexpr ll mod=1000000007;
struct node{
ll l,r;
mutable ll v;
node(ll l_,ll r_=-1,ll v_=0)
:l{l_},r{r_},v{v_}{}
bool operator<(const node& o)const{
return l<o.l;
}
};
set<node> odt;
// void dbg(){
// for(auto i:odt){
// cout<<i.l<<" "<<i.r<<" "<<i.v<<endl;
// }
// cout<<"======="<<endl;
// }
using iter_t=set<node>::iterator;
auto split(ll x){
if(x>n)return odt.end();
auto it=--odt.upper_bound(node{x});
if(it->l==x)return it;
auto l=it->l,r=it->r,v=it->v;
odt.erase(it);
odt.insert(node{l,x-1,v});
return odt.insert(node{x,r,v}).first;
}
void assign(ll l,ll r,ll v){
auto itr=split(r+1),itl=split(l);
odt.erase(itl,itr);
odt.insert(node{l,r,v});
}
ll sum(ll l,ll r){
auto itr=split(r+1),itl=split(l);
ll ans=0;
for(auto i=itl;i!=itr;++i){
ans=(ans+i->v*(i->r-i->l+1))%mod;
}
return ans;
}
void add(ll l,ll r,ll v){
auto itr=split(r+1),itl=split(l);
for(auto i=itl;i!=itr;++i){
i->v+=v;
i->v%=mod;
}
}
void copy(ll l1,ll r1,ll l2,ll r2){
auto itr=split(r1+1),itl=split(l1);
vector t(itl,itr);
itr=split(r2+1),itl=split(l2);
odt.erase(itl,itr);
// cout<<"t: ";
// for(auto i:t){
// cout<<i.l<<" ";
// }
// cout<<endl;
for(auto& i:t){
// cout<<"insert "<<i.l-l1+l2<<" "<<i.r-l1+l2<<" "<<i.v<<endl;
odt.insert(node{i.l-l1+l2,i.r-l1+l2,i.v});
}
}
void swap(ll l1,ll r1,ll l2,ll r2){
auto itr1=split(r1+1),itl1=split(l1);
vector t1(itl1,itr1);
odt.erase(itl1,itr1);
auto itr2=split(r2+1),itl2=split(l2);
vector t2(itl2,itr2);
odt.erase(itl2,itr2);
// cout<<"FUCK{"<<endl;
// dbg();
// cout<<"}FUCK"<<endl;
// cout<<"t1: ";
// for(auto i:t1){
// cout<<i.l<<" ";
// }
// cout<<endl;
// cout<<"t2: ";
// for(auto i:t2){
// cout<<i.l<<" ";
// }
// cout<<endl;
for(auto& i:t1){
odt.insert(node{i.l-l1+l2,i.r-l1+l2,i.v});
// cout<<"insert t1 "<<i.l-l1+l2<<" "<<i.r-l1+l2<<" "<<i.v<<endl;
}
for(auto& i:t2){
odt.insert(node{i.l-l2+l1,i.r-l2+l1,i.v});
// cout<<"insert t2 "<<i.l-l2+l1<<" "<<i.r-l2+l1<<" "<<i.v<<endl;
}
}
void reverse(ll l,ll r){
auto itr=split(r+1),itl=split(l);
vector<node> t{itl,itr};
odt.erase(itl,itr);
ll ll=l;
for(auto i=t.rbegin();i!=t.rend();++i){
odt.insert(node{ll,ll+i->r-i->l,i->v});
ll+=i->r-i->l+1;
}
}
int main(){
cin.tie(nullptr);
ios::sync_with_stdio(false);
cin>>n>>m;
node t{1,1};
cin>>t.v;
ll last=t.v;
for(ll i=2;i<=n;++i){
ll x;
cin>>x;
if(x!=last){
odt.insert(t);
t.l=i;
t.r=i;
t.v=x;
}
t.r=i;
last=x;
}
odt.insert(t);
// odt.insert(node{n+1,n+1,114514});
// dbg();
for(ll i=1;i<=m;++i){
ll op,l,r,a,b;
cin>>op>>l>>r;
// cout<<"operator "<<i<<": "<<endl;
if(op==1){
// cout<<"sum "<<l<<" "<<r<<endl;
cout<<sum(l,r)<<"\n";
}else if(op==2){
cin>>a;
// cout<<"assign "<<l<<" "<<r<<" "<<a<<endl;
assign(l,r,a);
}else if(op==3){
cin>>a;
// cout<<"add "<<l<<" "<<r<<" "<<a<<endl;
add(l,r,a);
}else if(op==4){
cin>>a>>b;
// if(l>a){
// swap(l,a);
// swap(r,b);
// }
// cout<<"copy "<<l<<" "<<r<<" "<<a<<" "<<b<<endl;
copy(l,r,a,b);
}else if(op==5){
cin>>a>>b;
// if(l>a){
// swap(l,a);
// swap(r,b);
// }
// cout<<"swap "<<l<<" "<<r<<" "<<a<<" "<<b<<endl;
swap(l,r,a,b);
}else{
// cout<<"reverse "<<l<<" "<<r<<endl;
reverse(l,r);
}
// dbg();
}
// cout<<odt.size()<<endl;
// dbg();
for(auto i:odt){
for(ll j=i.l;j<=i.r;++j){
cout<<i.v%mod<<" ";
}
}
}
~~~