WA样例2
查看原帖
WA样例2
285617
黑影洞人楼主2022/4/17 10:00
#include<cstdio>
#include<algorithm>
#include<set>
#include<vector>
#define int long long
#define ct Chtholly_tree
#define Chtholly set<Chtholly_tree>::iterator 
#define N 1919810
using namespace std;
int n,m,seed,vmax,a[N];
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 &a)const{return l<a.l;}
};
set<Chtholly_tree> st;
int qpow(int a,int b,int mod){
	int res = 1;
	int ans = a % mod;
	while (b){
		if (b&1) res = res * ans % mod;
		ans = ans * ans % mod;
		b>>=1;
	}
	return res;
}
void insert(int p,int x){
	st.insert(ct(p,p,x));
}
Chtholly split(int p){
	Chtholly it=st.lower_bound(ct(p));
	if(it!=st.end()&&it->l==p)return it;
	it--;ct tmp=*it;st.erase(it);
	st.insert(ct(tmp.l,p-1,tmp.val));
	return st.insert(ct(p,tmp.r,tmp.val)).first;//first return iterator
}
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+=val;
}
int sum(int l,int r,int ex,int md){
	int ans=0;
	Chtholly right=split(r+1),left=split(l);
	for(;left!=right;left++)ans=ans+(left->r-left->l+1)*qpow(left->val,ex,md)%md;
	return ans;
}
int kth(int l,int r,int k){
	int ans=0;
	vector<pair<int ,int > >v;
	Chtholly right=split(r+1),left=split(l);v.clear();
	for(;left!=right;left++)v.push_back({left->val,left->r-left->l+1});
	sort(v.begin(),v.end());
	for(vector<pair<int,int> >::iterator it=v.begin();it!=v.end();it++){
		k-=it->second;
		if(k<=0)return it->first;
	}
	return -1;
}
int rnd(){
	int ret = seed;
	seed = (seed * 7 + 13) %1000000007;
	return ret;
}
signed main(){
	scanf("%lld%lld%lld%lld",&n,&m,&seed,&vmax);
	for(int i=1;i<=n;i++)st.insert(ct(i,i,((rnd()%vmax)+1)));
	insert(n+1,0);
	for(int i=1;i<=m;i++){
		int op=(rnd()%4)+1,l=(rnd()%n)+1,r=(rnd()%n)+1,x=0,y=0;
		if(l>r)swap(l,r);
		if(op==3)x=(rnd()%(r-l+1))+1;
		else x=(rnd()%vmax)+1;
		if(op==4)y=(rnd()%vmax)+1;
		if(op==1)add(l,r,x);
		if(op==2)assign(l,r,x);
		if(op==3)printf("%lld\n",kth(l,r,x));
		if(op==4)printf("%lld\n",sum(l,r,x,y));
	}
	return 0;
}



2022/4/17 10:00
加载中...