自测数据
10 1
1 9 1 9 8 1 0 1 1 4
4 1 5 6 10
代码:
#include<iostream>
#include<set>
#include<vector>
#define elif else if
#define ll long long
#define up(i,x,y) for (int (i)=(x);(i)<=(y);(i)++)
#define down(i,x,y) for (int (i)=(x);(i)>=(y);(i)--)
using namespace std;
#define dtype long long
struct node{
const int l,r;
mutable dtype v;
bool operator<(const node &a) const{
return l<a.l;
}
};
int n;
const ll mod=1000000007;
set<node>cht;
vector<node>tmp;
auto split(int x){
if (x>n) return cht.end();
auto it= --cht.upper_bound({x,0,0});
if (it->l==x) return it;
int l=it->l,r=it->r;
dtype v=it->v;
cht.erase(it);
cht.insert({l,x-1,v});
return cht.insert({x,r,v}).first;
}
void assign(int l,int r,dtype v){
auto itr=split(r+1),itl=split(l);
cht.erase(itl,itr);
cht.insert({l,r,v});
}
void add(int l,int r,dtype x){
auto itr=split(r+1),itl=split(l);
for(auto i=itl;i!=itr;i++) i->v=(i->v+x)%mod;;
}
dtype sum(int l,int r){
dtype res=0;
auto itr=split(r+1),itl=split(l);
for(auto i=itl;i!=itr;i++) res=(res+(i->v)*(i->r-i->l+1))%mod;
return res;
}
int q,op,a,b,x,y;
ll v;
int main(){
// ios::sync_with_stdio(0);
// cin.tie(0);
// cout.tie(0);
cin>>n>>q;
up(i,1,n){
cin>>v;
cht.insert({i,i,v});
}
while(q--){
cin>>op>>a>>b;
if (op==1) cout<<sum(a,b)<<"\n";
elif (op==2){
cin>>b;
assign(a,b,b);
}
elif (op==3){
cin>>v;
add(a,b,v);
}
elif (op==4){
cin>>x>>y;
auto itr=split(y+1),itl=split(x);
cht.erase(itl,itr);
itr=split(b+1),itl=split(a);
for (auto i=itl;i!=itr;i++) {
node tmp={x+i->l-a,x+i->r-a,i->v};
cout<<tmp.l<<" "<<tmp.r<<" "<<tmp.v<<endl;
auto cc=cht.insert(tmp).first;
cout<<cc->l<<" "<<cc->r<<" "<<cc->v<<endl;
}
}
elif (op==5){
cin>>x>>y;
auto itr=split(b+1),itl=split(a);
for (auto i=itl;i!=itr;i++) tmp.push_back({x+i->l-a,x+i->r-a,i->v});
cht.erase(itl,itr);
itr=split(y+1),itl=split(x);
for (auto i=itl;i!=itr;i++) cht.insert({a+i->l-x,a+i->r-x,i->v});
cht.erase(itl,itr);
for (node u:tmp) cht.insert(u);
tmp.clear();
}else{
auto itr=split(b+1),itl=split(a);
for (auto i=itl;i!=itr;i++) tmp.push_back({a+b-i->l,a+b-i->r,i->v});
cht.erase(itl,itr);
for (node u:tmp) cht.insert(u);
tmp.clear();
}
}
for (node u:cht) up(i,u.l,u.r) cout<<u.v<<" ";
}