珂朵莉树 WA10pts
查看原帖
珂朵莉树 WA10pts
1073995
Saint_ying_xtf楼主2024/5/19 09:46

rt

// Author: Expert_Dream
// Copyright (c) 2024 Expert_Dream All rights reserved.
// Problem: P5350 序列
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P5350
// Memory Limit: 128 MB
// Time Limit: 3000 ms
// Date: 2024-05-18 11:46:41

// #pragma GCC optimize(2,3,"Ofast","inline")
#include<bits/stdc++.h>
// #include <atcoder/all>
#define ll long long
#define i128 __int128
#define ull unsigned long long
#define pii pair<int,int>
#define pll pair<long long, long long>
#define fs first
#define sc second
#define x0 _x0_
#define y1 _y1_
#define endl '\n'
#define re register
#define pb push_back
#define vi vector<int>
#define pq priority_queue
#define mem(a,x) memset((a),(x),sizeof(a))
#define debug puts("AK IOI")
#define sz(s) (int)(s.size())
#define all(a) a.begin(),a.end()
#define rd(l,r) (myrand()%(r-l+1)+l)
#define print(x) {cout<<x<<endl;return;}
#define For(x,y,z) for(int x = y;x <= z;x++)
#define For_(x,y,z) for(int x = y;x >= z;x--)
#define between(x, flo, top) (flo <= x && x <= top)
// #define double long double
using namespace std;
// using namespace atcoder;
#define int long long
const int mod = 1e9+7;
//const int mod = 998244353;
mt19937 myrand(time(0));
const int inf = 0x3f3f3f3f,N = 3e5+5,M = 1e6+5,K = 3000+5;
const long long linf = 0x3f3f3f3f3f3f3f3f;
namespace FastIO {template <typename T = int>inline T read() {T s=0,w=1;char c=getchar();while(!isdigit(c)){if(c=='-')w=-1;c=getchar();}while(isdigit(c))s=(s<<1)+(s<<3)+(c^48),c=getchar();return s*w;}template <typename T>inline void read(T &s){s=0;int w=1;char c=getchar();while(!isdigit(c)){if(c=='-')w=-1;c=getchar();}while(isdigit(c))s=(s<<1)+(s<<3)+(c^48),c=getchar();s*=w;}template <typename T, typename... Args> inline void read(T &x, Args &...args) {read(x), read(args...);}template <typename T>inline void write(T x,char ch = '\n') {if(x<0)x=-x,putchar('-');static char stk[200];int top=0;do{stk[top++]=x%10+'0',x/=10;}while(x);while(top)putchar(stk[--top]);putchar(ch);return;}}
using namespace FastIO;

int n,m;
int a[N];
namespace ODT{
	struct node{
		int l,r;mutable int val;
		// mutable 修饰变量使得其在 const 函数下依然是变量
		// 就可以直接在 set 中修改该变量的值,而不是取出元素修改后再重新插入 set
		node(int L,int R=-1,int Val=0){l=L,r=R,val=Val;}
		bool operator<(const node&a)const{return l<a.l;}		
	};set<node> odt;
	auto split(int pos){ // 分割区间操作
		auto it=odt.lower_bound(node(pos));
		if(it!=odt.end()&&it->l==pos)return it;
		it--;int L=it->l,R=it->r,Val=it->val;
		odt.erase(it),odt.insert(node{L,pos-1,Val});
		return odt.insert(node{pos,R,Val}).fs;// 返回的是迭代器
	}void assign(int l,int r,int val){ // 合并区间操作
		auto R=split(r+1),L=split(l);
		odt.erase(L,R);odt.insert(node{l,r,val});
	}void add(int l,int r,int val){ // 区间加
		auto R=split(r+1),L=split(l);
		for(auto it=L;it!=R;it++)it->val += val;	
	}int kth(int l,int r,int k){ // 第k小
		vector<pii> a;
		auto R=split(r+1),L=split(l);
		for(auto it=L;it!=R;it++)a.pb({it->val,(it->r)-(it->l)+1});
		sort(a.begin(),a.end());
		for(auto it=a.begin();it!=a.end();it++){
			k-=it->second;
			if(k <= 0)return it->first;
		}return -1;
	}
	int sum(int l,int r){//区间次幂和
		int ans=0;
		auto R=split(r+1),L=split(l);
		for(auto it=L;it!=R;it++)ans+=it->val%mod*((it->r)-(it->l)+1)%mod,ans%=mod;
		return ans%mod;
	}void copy(int l1,int r1,int l2,int r2){ // 复制 (l1,r1) 到 (l2,r2)
		auto R=split(r1+1),L=split(l1);
		vector<node> v;
		for(auto it=L;it!=R;it++)v.pb({it->l,it->r,it->val});
		auto r_=split(r2+1),l_=split(l2);
		odt.erase(l_,r_);
		for(auto it:v)odt.insert(node(it.l-l1+l2,it.r-r1+r2,it.val));
	}void Swap(int l1,int r1,int l2,int r2){ // 交换(l1,r1)和(l2,r2)区间
		if(l1>l2){swap(l1,l2),swap(r1,r2);}
		vector<node> v1,v2;
		auto R1=split(r1+1),L1=split(l1);
		for(auto it=L1;it!=R1;it++) v1.pb({it->l,it->r,it->val});
		auto R2=split(r2+1),L2=split(l2);
		for(auto it=L2;it!=R2;it++) v2.pb({it->l,it->r,it->val});
		R1=split(r1+1),L1=split(l1);odt.erase(L1,R1);
		R2=split(r2+1),L2=split(l2);odt.erase(L2,R2);
		for(auto it:v2) odt.insert(node{it.l-l2+l1,it.r-l2+l1,it.val});
		for(auto it:v1) odt.insert(node{it.l-l1+l2,it.r-l1+l2,it.val});
	}void reverse(int l,int r){
		if(l>r)swap(l,r);
		auto R=split(r+1),L=split(l);
		vector<node> a;
		for(auto it=L;it!=R;it++) a.pb(node(it->l,it->r,it->val));
		odt.erase(L,R);
		for(auto it:a) odt.insert(node(r-it.r+l,r-it.l+l,it.val));
	}void Print(){
		for(auto it=odt.begin();it!=odt.end()&&it->r<=n;it++) for(int i=it->l;i<=it->r;i++) cout<<it->val<<" ";  
	}
	// void update(int l,int r){ // 各种操作样式
		// auto R=split(r+1),L=split(l);
		// for(auto it=L;it!=R;it++)/*do something*/;
	// }
}using namespace ODT;

void solve(){
	cin >> n >> m;
	For(i,1,n){
		cin>>a[i];
		odt.insert(node(i,i,a[i]));
	}	
	while(m--){
		int op,l,r,val,l1,r1,l2,r2;
		read(op);
		if(op==1){
			read(l,r);
			cout << sum(l,r)%mod << endl;
		} else if(op==2){
			read(l,r,val);
			assign(l,r,val);
		} else if(op==3){
			read(l,r,val);
			add(l,r,val);
		} else if(op==4){
			read(l1,r1,l2,r2);
			copy(l1,r1,l2,r2);
		} else if(op==5){
			read(l1,r1,l2,r2);
			Swap(l1,r1,l2,r2);
		} else{
			read(l,r);
			reverse(l,r);
		}
	}
	Print();
}signed main(){
	// ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	int T=1;
	// read(T);
	For(_,1,T) solve();
	return 0;
}
2024/5/19 09:46
加载中...