set 指针总乱飘怎么办QAQ?
#include<bits/stdc++.h>
#define int long long
#define N 10000005
#define M 1000000007
using namespace std;
struct Chtholly{
int l,r;
mutable int v;
Chtholly(int l,int r=-1,int v=-1):l(l),r(r),v(v){}
bool operator<(const Chtholly &a)const{
return l<a.l;
}
};
set<Chtholly>s;
int n,m,T,siz[N],val[N],cnt,Siz[N],Val[N],Cnt;
set<Chtholly>::iterator split(int p){
auto it=s.lower_bound(Chtholly(p));
if(it!=s.end()&&it->l==p) return it;
it--;
if(it->r<p) return s.end();
int l=it->l,r=it->r,v=it->v;
s.erase(it);
s.insert(Chtholly(l,p-1,v));
return s.insert(Chtholly(p,r,v)).first;
}
void assign(int l,int r,int x){
auto itr=split(r+1),itl=split(l);
s.erase(itl,itr);
s.insert(Chtholly(l,r,x));
}
void add(int l,int r,int x){
auto itr=split(r+1),itl=split(l);
for(auto it=itl;it!=itr;it++) it->v+=x,it->v%=M;
}
void cpy(int l,int r,int L,int R){
auto itr=split(r+1),itl=split(l);
cnt=0;
for(auto it=itl;it!=itr;it++) siz[++cnt]=it->r-it->l+1,val[cnt]=it->v;
itr=split(R+1),itl=split(L);
s.erase(itl,itr);
for(int i=1;i<=cnt;i++){
s.insert(Chtholly(L,L+siz[i]-1,val[i]));
L+=siz[i];
}
}
void swp(int l,int r,int L,int R){
if(l>L) swap(l,L),swap(r,R);
auto itr=split(r+1),itl=split(l);
cnt=0;
for(auto it=itl;it!=itr;it++) siz[++cnt]=it->r-it->l+1,val[cnt]=it->v;
itr=split(R+1),itl=split(L);
Cnt=0;
for(auto it=itl;it!=itr;it++) Siz[++Cnt]=it->r-it->l+1,Val[Cnt]=it->v;
itr=split(r+1),itl=split(l);
s.erase(itl,itr);
itr=split(R+1),itl=split(L);
s.erase(itl,itr);
for(int i=1;i<=Cnt;i++){
s.insert(Chtholly(l,l+Siz[i]-1,Val[i]));
l+=Siz[i];
}
for(int i=1;i<=cnt;i++){
s.insert(Chtholly(L,L+siz[i]-1,val[i]));
L+=siz[i];
}
}
void rvs(int l,int r){
auto itr=split(r+1),itl=split(l);
cnt=0;
for(auto it=itl;it!=itr;it++) siz[++cnt]=it->r-it->l+1,val[cnt]=it->v;
s.erase(itl,itr);
for(int i=cnt;i;i--){
s.insert(Chtholly(l,l+siz[i]-1,val[i]));
l+=siz[i];
}
}
int solve(int l,int r){
auto itr=split(r+1),itl=split(l);
int ret=0;
for(auto it=itl;it!=itr;it++) ret=(ret+(it->v)*(it->r-it->l+1)%M)%M;
return ret;
}
signed main(){
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1,a;i<=n;i++) cin>>a,s.insert(Chtholly(i,i,a%M));
int l,r,op,L,R;
while(m--){
cin>>op>>l>>r;
if(op==1) cout<<solve(l,r)<<endl;
if(op==2) cin>>L,assign(l,r,L);
if(op==3) cin>>L,add(l,r,L);
if(op==4) cin>>L>>R,cpy(l,r,L,R);
if(op==5) cin>>L>>R,swp(l,r,L,R);
if(op==6) rvs(l,r);
}
for(auto it=s.begin();it!=s.end();it++){
int len=it->r-it->l+1;
while(len--) cout<<it->v<<" ";
}
return 0;
}
在 swap 操作中()