珂朵莉树

珂朵莉树,说白了是高级的暴力。
它维护的是区间,底层是平衡树。
就是让平衡树去维护区间,同时维护我们所需要的变量。
当需要进行区间修改时,我们将若干个区间取出,将[l,r]之内及边界处的区间删除.
在边界处的区间需要用一个操作:split去将一个大区间分裂,然后造出来两个小区间,接着方便操作。
然后其他操作就几乎是暴力了,将一段区间拿出来,总体操作,然后返回。

#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
#define qr qr()
#define pa pair<ll,int>
#define ve vector
#define fi first
#define se second
#define es erase
#define itt set<nd>::iterator
using namespace std;
const int N=2e5+200,mod=1e9+7;
inline ll qr{
	ll x=0;char ch=getchar();
	while(ch>57||ch<48)ch=getchar();
	while(ch>=48&&ch<=57)x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return x;
}
struct nd{
	mutable int l,r;
	mutable ll v;
	bool operator<(const nd &a)const{
		return l<a.l;
	}
};
ll n,m,seed;int vmax;
set<nd>s;
inline auto split(int pos){
	auto it=s.lower_bound({pos});
	if(it!=s.end()&&it->l==pos)return it;
	--it;
	if(it->r<pos)return s.end();//如果lowerbound左侧节点右界<pos,则可以发现没有该区间,因为等于在前面判过了.
	int r=it->r;ll v=it->v;
	// s.erase(it);
	it->r=pos-1;//这里也是优化,少删一个区间.
	// s.insert({l,pos-1,v});
	return s.insert({pos,r,v}).fi;
}
inline void add(ll l,ll r,ll x){
	auto itr=split(r+1),itl=split(l);
	for(auto it=itl;it!=itr;++it)it->v+=x;
}
//inline void assign(int l,int r,ll x){
//	auto itr=split(r+1),itl=split(l);
//	s.erase(itl,itr);
//	s.insert({l,r,x});
//}
void assign(int l,int r,int val){//优化版,少删一个区间.
	auto itr=split(r+1),itl=split(l);
	itl->r=r,itl->v=val;
	t.erase(++itl,itr);
}
inline ll kth(ll l,ll r,ll x){
	auto itr=split(r+1),itl=split(l);
	ve<pa>v;
	for(auto it=itl;it!=itr;++it)v.push_back({it->v,it->r-it->l+1});
	sort(v.begin(), v.end());
	unsigned int i;
	for(i=0;i<v.size();++i){
		if(v[i].se<x)x-=v[i].se;
		else break;
	}return v[i].fi;
}
inline ll qp(ll x,ll y,ll p){
	ll r=1;x%=p;
	while(y){
		if(y&1)r=x*r%p;
		x=x*x%p;
		y>>=1;
	}return r;
}
inline ll calP(ll l,ll r,ll x,ll y){
	auto itr=split(r+1),itl=split(l);
	ll ans=0;
	for(auto it=itl;it!=itr;++it)
		ans=(ans+qp(it->v,x,y)*(it->r-it->l+1))%y;
	return ans;
}
inline int rd(){
	int ret=seed;
	seed=(seed*7+13)%mod;
	return ret;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	freopen("in.in","r",stdin);
	freopen("out.out","w",stdout);
	n=qr,m=qr,seed=qr,vmax=qr;
	for(int i=1;i<=n;++i)
		s.insert({i,i,rd()%vmax+1});
	for(int i=1;i<=m;++i){
		ll op=rd()%4+1,l=rd()%n+1,r=rd()%n+1,x,y;
		if(l>r)swap(l,r);
		if(op==3)x=rd()%(r-l+1)+1;
		else x=rd()%vmax+1;
		if(op==4)y=rd()%vmax+1;
		if(op==1)add(l,r,x);
		else if(op==2)assign(l,r,x);
		else if(op==3)cout<<kth(l,r,x)<<'\n';
		else cout<<calP(l,r,x,y)<<'\n';
	}
	return 0;
}
posted @   SLS-wwppcc  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示