玄关 求调
查看原帖
玄关 求调
358753
Ggt__楼主2024/8/8 14:41

此程序没有任何输出:(

#include<bits/stdc++.h>
using namespace std;
int n,m,seed,vmax;
int rnd(){
	int ret=seed;
	seed=(seed*7+13)%1000000007;
	return ret;
}
int a[100001];
struct node{
	int l,r;
	mutable int v;
	node(int l,int r=0,int v=0):l(l),r(r),v(v){}
	bool operator < (const node &o) const{
		return l<o.l;
	}
};
set<node> s;
#define IT set<node>::iterator
int qpow(int a,int b,int mod){
	int ans=1;
	if(b&1) ans=ans*a%mod;
	while(b>>=1){
		ans=(long long)ans*a*a%mod;
	}
	return ans;
}
IT devide(int pos){
	IT it=s.lower_bound(node(pos));
	if(it!=s.end()&&it->l==pos) return it;
	--it;
	int L=it->l,R=it->r,V=it->v;
	s.erase(it);
	s.insert(node(L,pos-1,V));
	return s.insert(node(pos,R,V)).first;
}
void change(int l,int r,int v){
	IT itr=devide(r+1),itl=devide(l);
	s.erase(itl,itr);
	s.insert(node(l,r,v));
}
void add(int l,int r,int v){
	IT itr=devide(r+1),itl=devide(l);
	for(;itl!=itr;++itl) itl->v+=v;
}
bool cmp(node x,node y){
	return x.v<y.v;
}
int ask_rank(int l,int r,int rank){
	vector<node> vec;
	IT itr=devide(r+1),itl=devide(l);
	for(;itl!=itr;++itl) vec.push_back(*itl);
	sort(vec.begin(),vec.end(),cmp);
	int i;
	for(i=0;i<vec.size();++i){
		rank-=(vec[i].r-vec[i].l+1);
		if(rank<=0) break;
	}
	return vec[i].v;
}
int ask_sum(int l,int r,int x,int y){
	int ans=0;
	IT itr=devide(r+1),itl=devide(l);
	for(;itl!=itr;++itl) ans=(ans+(itl->r-itr->l+1)*qpow(itl->v,x,y)%y)%y;
	return ans;
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m>>seed>>vmax;
	for(int i=1;i<=n;++i) a[i]=(rnd()%vmax)+1;
	int latest=a[1];
	int left=1,right=1;
	for(int i=2;i<=n;++i){
		if(a[i]!=latest){
			s.insert(node(left,right,latest));
			latest=a[i];
			left=i;
			right=i;
		}
		else ++right;
	}
	s.insert(node(left,n,latest));
	s.insert(node(n+1,n+1,0));
	for(int i=1;i<=m;++i){
		int op=(rnd()%4)+1;
		int l=(rnd()%n)+1;
		int r=(rnd()%n)+1;
		if(l>r) swap(l,r);
		if(op==1){
			int x=(rnd()%vmax)+1;
			add(l,r,x);
		}
		if(op==2){
			int x=(rnd()%vmax)+1;
			change(l,r,x);
		}
		if(op==3){
			int x=(rnd()%(r-l+1))+1;
			cout<<ask_rank(l,r,x)<<"\n";
		}
		if(op==4){
			int x=(rnd()%vmax)+1;
			int y=(rnd()%vmax)+1;
			cout<<ask_sum(l,r,x,y)<<"\n";
		}
	}
	return 0;
}
2024/8/8 14:41
加载中...