可能是数据生成器产生负数了,求查错。
#include<iostream>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
typedef unsigned int ui ;
const int N = 1e6 + 5;
int t ,n, rt, vis[N];
ui seed, last = 7, m;
int val[N], rnd[N], sz[N], ls[N], rs[N];
ui randNum( ui& seed , ui last , const ui m){
seed = seed * 17 + last ; return seed % m + 1;
}
void pushup(int x){
sz[x] = sz[ls[x]] + sz[rs[x]] + 1;
}
int merge(int x, int y){
if(!x||!y) return x|y;
if(rnd[x] < rnd[y]){
rs[x] = merge(rs[x], y);
pushup(x);
return x;
}else{
ls[y] = merge(x, ls[y]);
pushup(y);
return y;
}
}
pair<int, int> split(int x, int v){
if(!x) return {0, 0};
if(val[x] > v){
auto p = split(ls[x], v);
ls[x] = p.second;
pushup(x);
return {p.first, x};
}else{
auto p = split(rs[x], v);
rs[x] = p.first;
pushup(x);
return {x, p.second};
}
}
void insert(int v, int x){
auto p = split(rt, v);
rt = merge(p.first, merge(x, p.second));
}
void del(int v){
auto p = split(rt, v), q = split(p.first, v - 1);
q.second = merge(ls[q.second], rs[q.second]);
rt = merge(q.first, merge(q.second, p.second));
}
int Rank(int v){
auto p = split(rt, v - 1);
int res = sz[p.first] + 1;
rt = merge(p.first, p.second);
return res;
}
signed main(){
scanf("%lld", &t);
while(t--){
scanf("%lld%lld%lld", &m, &n, &seed);
int now = 0;
rt = 0;
for(int i = 1; i <= n; i++){
int x = randNum(seed, last, m);
int w = randNum(seed, last, m);
if(!vis[x]) vis[x] = 1, now++, rnd[x] = rand(), sz[x] = 1, ls[x] = rs[x] = 0;
del(val[x]);
val[x] = val[x] + 1e7 - w, sz[x] = 1;
ls[x] = 0, rs[x] = 0, rnd[x] = rand();
insert(val[x], x);
last = now - Rank(val[x]);
cout << x << " " << w << endl;
printf("%lld\n", last);
}
}
return 0;
}