```cpp
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#define int long long
#define p 1000000007
#define ct Chtholly_tree
#define Chtholly set<Chtholly_tree>::iterator
using namespace std;
int n,m;
struct Chtholly_tree{
int l,r;
mutable int val;
ct(int a=-1,int b=-1,int c=0){l=a,r=b,val=c;}
bool operator <(const ct &c)const{return l<c.l;}
};
set<ct> st;
Chtholly split(int pp){
Chtholly it=st.lower_bound(ct(pp));
if(it!=st.end()&&it->l==pp)return it;
it--;ct tmp=*it;st.erase(it);
st.insert(ct(tmp.l,pp-1,tmp.val));
return st.insert(ct(pp,tmp.r,tmp.val)).first;
}
int getsum(int l,int r){
Chtholly right=split(r+1),left=split(l);
int ans=0;
for(;left!=right;left++)ans=(ans+((left->r-left->l+1)*left->val%p))%p;
return ans;
}
void assign(int l,int r,int val){
Chtholly right=split(r+1),left=split(l);
st.erase(left,right);
st.insert(ct(l,r,val));
}
void add(int l,int r,int val){
Chtholly right=split(r+1),left=split(l);
for(;left!=right;left++)left->val=(left->val+val)%p;
}
void copy(int l1,int r1,int l2,int r2){
Chtholly right=split(r1+1),left=split(l1);
vector<ct> a;
for(;left!=right;left++)a.push_back(*left);
Chtholly r=split(r2+1),l=split(l2);
st.erase(l,r);
for(int i=0;i<a.size();i++)st.insert(ct(l2+a[i].l-l1,l2+a[i].r-l1,a[i].val));
}
void rreverse(int l,int r){
Chtholly right=split(r+1),left=split(l);
vector<ct> a;
for(;left!=right;left++)a.push_back(*left);
reverse(a.begin(),a.end());st.erase(left,right);
for(int i=0;i<a.size();i++)st.insert(ct(l+r-a[i].r,l+r-a[i].r,a[i].val));
}
void swapp(int l1,int r1,int l2,int r2){
Chtholly right=split(r1+1),left=split(l1);
vector<ct> a,b;int tot=0;
for(;left!=right;left++)a.push_back(*left);
Chtholly r=split(r2+1),l=split(l2);
for(;l!=r;l++)b.push_back(*l);
st.erase(l,r);
for(int i=0;i<a.size();i++)st.insert(ct(l2+a[i].l-l1,l2+a[i].r-l1,a[i].val));
right=split(r1+1),left=split(l1);
st.erase(left,right);
for(int i=0;i<b.size();i++)st.insert(ct(l1+b[i].l-l2,l1+b[i].r-l2,b[i].val));
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++){
int a;
scanf("%lld",&a);
st.insert(ct(i,i,a));
}
for(int i=1;i<=m;i++){
int op,l1,r1,l2,r2,val;
scanf("%lld%lld%lld",&op,&l1,&r1);
if(op==1)printf("%lld\n",getsum(l1,r1));
if(op==2)scanf("%lld",&val),assign(l1,r1,val);
if(op==3)scanf("%lld",&val),add(l1,r1,val);
if(op==4)scanf("%lld%lld",&l2,&r2),copy(l1,r1,l2,r2);
if(op==5)scanf("%lld%lld",&l2,&r2),swapp(l1,r1,l2,r2);
if(op==6)rreverse(l1,r1);
}
for(Chtholly it=st.begin();it!=st.end()&&it->r<=n;it++){
for(int i=it->l;i<=it->r;i++)printf("%lld ",it->val);
}
return 0;
}
```
by 黑影洞人 @ 2022-07-05 22:42:46
改了第三遍
```cpp
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#define int long long
#define p 1000000007
#define ct Chtholly_tree
#define Chtholly set<Chtholly_tree>::iterator
using namespace std;
int n,m;
struct Chtholly_tree{
int l,r;
mutable int val;
ct(int a=-1,int b=-1,int c=0){l=a,r=b,val=c;}
bool operator <(const ct &c)const{return l<c.l;}
};
set<ct> st;
Chtholly split(int pp){
Chtholly it=st.lower_bound(ct(pp));
if(it!=st.end()&&it->l==pp)return it;
it--;ct tmp=*it;st.erase(it);
st.insert(ct(tmp.l,pp-1,tmp.val));
return st.insert(ct(pp,tmp.r,tmp.val)).first;
}
int getsum(int l,int r){
Chtholly right=split(r+1),left=split(l);
int ans=0;
for(;left!=right;left++)ans=(ans+((left->r-left->l+1)*left->val%p))%p;
return ans;
}
void assign(int l,int r,int val){
Chtholly right=split(r+1),left=split(l);
st.erase(left,right);
st.insert(ct(l,r,val));
}
void add(int l,int r,int val){
Chtholly right=split(r+1),left=split(l);
for(;left!=right;left++)left->val=(left->val+val)%p;
}
void copy(int l1,int r1,int l2,int r2){
Chtholly right=split(r1+1),left=split(l1);
vector<ct> a;
for(;left!=right;left++)a.push_back(*left);
Chtholly r=split(r2+1),l=split(l2);
st.erase(l,r);
for(int i=0;i<a.size();i++)st.insert(ct(l2+a[i].l-l1,l2+a[i].r-l1,a[i].val));
}
void rreverse(int l,int r){
Chtholly right=split(r+1),left=split(l);
vector<ct> a;
for(;left!=right;left++)a.push_back(*left);
st.erase(left,right);
for(int i=0;i<a.size();i++)st.insert(ct(l+r-a[i].r,l+r-a[i].l,a[i].val));
}
void swapp(int l1,int r1,int l2,int r2){
Chtholly right=split(r1+1),left=split(l1);
vector<ct> a,b;
for(;left!=right;left++)a.push_back(*left);
st.erase(left,right);
Chtholly r=split(r2+1),l=split(l2);
for(;l!=r;l++)b.push_back(*l);
st.erase(l,r);
for(int i=0;i<b.size();i++)st.insert(ct(l1+b[i].l-l2,l1+b[i].r-l2,b[i].val));
for(int i=0;i<a.size();i++)st.insert(ct(l2+a[i].l-l1,l2+a[i].r-l1,a[i].val));
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++){
int a;
scanf("%lld",&a);
st.insert(ct(i,i,a));
}
for(int i=1;i<=m;i++){
int op,l1,r1,l2,r2,val;
scanf("%lld%lld%lld",&op,&l1,&r1);
if(op==1)printf("%lld\n",getsum(l1,r1));
if(op==2)scanf("%lld",&val),assign(l1,r1,val);
if(op==3)scanf("%lld",&val),add(l1,r1,val);
if(op==4)scanf("%lld%lld",&l2,&r2),copy(l1,r1,l2,r2);
if(op==5)scanf("%lld%lld",&l2,&r2),swapp(l1,r1,l2,r2);
if(op==6)rreverse(l1,r1);
}
for(Chtholly it=st.begin();it!=st.end()&&it->r<=n;it++){
for(int i=it->l;i<=it->r;i++)printf("%lld ",it->val);
}
return 0;
}
```
by 黑影洞人 @ 2022-07-05 22:51:50
AC了,有个疑问,本题珂朵莉树不开O2可以AC吗
by 黑影洞人 @ 2022-07-07 19:02:06