code

#include<bits/stdc++.h>
//为什么不给大样例,幸好我自己造了几组数据,才确认无误
using namespace std;
int t;
typedef unsigned int ui ;
ui randNum( ui& seed , ui last , const ui m){
	seed = seed * 17 + last ; return seed % m + 1;
}
void write(int x)
{
if(x<10)
{
putchar(x+48);
return;
}
write(x/10),write(x%10);
}

int cnt,rt;
struct no{
	int siz,pri,ls,rs,ci;
	pair<int,int>val;
}tree[2000010];
int new_node(pair<int,int>val,int ci){
	tree[++cnt].val=val;
	tree[cnt].pri=rand();
	tree[cnt].ls=tree[cnt].rs=0;
	tree[cnt].siz=ci;
	tree[cnt].ci=ci;
	return cnt;
}
int cmp(pair<int,int>a,pair<int,int>b){
	if(a.first==b.first)return a.second>=b.second;
	return a.first<=b.first;
}
void split(int u,pair<int,int> val,int &L,int &R){
	if(u==0){
		L=R=0;
		return;
	}
	if(cmp(tree[u].val,val)){
		L=u;
		split(tree[u].rs,val,tree[u].rs,R);
	}else{
		R=u;
		split(tree[u].ls,val,L,tree[u].ls);
	}
	tree[u].siz=tree[tree[u].ls].siz+tree[tree[u].rs].siz+tree[u].ci;
}
int merge(int l,int r){
	if(l==0 or r==0)return l+r;
	if(tree[l].pri>tree[r].pri){
		tree[l].rs=merge(tree[l].rs,r);
		tree[l].siz=tree[tree[l].ls].siz+tree[tree[l].rs].siz+tree[l].ci;
		return l;
	}else{
		tree[r].ls=merge(l,tree[r].ls);
		tree[r].siz=tree[tree[r].ls].siz+tree[tree[r].rs].siz+tree[r].ci;
		return r;
	}
}
int last=7;
int ac[200010],tim[200010];
void solve(){
	int m,n;ui seed;
	cin>>m>>n>>seed;
	cnt=0;rt=0;
	memset(tree,0,sizeof tree);
	memset(ac,0,sizeof ac);
	memset(tim,0,sizeof tim);
	rt=merge(rt,new_node({0,0},n));
	for(int i=1;i<=n;i++){
		int a=randNum(seed,last,m),b=randNum(seed,last,m);
		//cout<<a<<" "<<b<<endl;
		int L,p,R;
		split(rt,{ac[a],tim[a]},L,R);
		split(L,{ac[a],tim[a]+1},L,p);
		ac[a]++;
		tim[a]+=b;
		//cout<<tree[R].siz<<endl;
		tree[p].ci--;
		tree[p].siz--;
		if(tree[p].ci)rt=merge(merge(L,p),R);
		else rt=merge(L,R);
		split(rt,{ac[a],tim[a]},L,R);
		//cout<<tree[L].siz<<endl;
		split(L,{ac[a],tim[a]+1},L,p);
		//cout<<ac[a]<<" "<<tim[a]<<endl;
		if(p)tree[p].ci++,tree[p].siz++;
		else p=new_node({ac[a],tim[a]},1);
		write(last=tree[R].siz);
		putchar('\n');
		rt=merge(merge(L,p),R);
	}
}
//1,4 3,11 0,0 3,10 3,10

main(){
	freopen("rank.in","r",stdin);
	freopen("rank.out","w",stdout);
	cin>>t;
	while(t--)solve();
	return 0;
}
posted @ 2026-03-05 16:14  zoupiwa666  阅读(14)  评论(0)    收藏  举报