
这个是运行这个的代码
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
const int N = 1e6;
// mt19937 rnd(233);
int n, m, q, cnt;
struct FHQ
{
struct node
{
int ls, rs;
int size, val, rand;
} *tr;
int root, L, R ,p;
FHQ()
{
tr = new node[N]();
}
int clone(int val)
{
tr[ ++ cnt].val = val;
tr[cnt].rs = tr[cnt].ls = 0;
tr[cnt].size = 1;
tr[cnt].rand = rand();
return cnt;
}
void push_up(int u)
{
tr[u].size = tr[tr[u].ls].size + tr[tr[u].rs].size + 1;
}
void split(int u, int k, int &L, int &R)
{
if (!u) return L = R = 0, void();
if (k <= tr[tr[u].ls].size)
{
R = u;
split(tr[u].ls, k, L, tr[u].ls);
}
else
{
L = u;
split(tr[u].rs, k - tr[tr[u].ls].size - 1, tr[u].rs, R);
}
push_up(u);
}
void __split(int u, int x, int &L, int &R)
{
if (!u) return L = R = 0, void();
if (tr[u].val <= x)
{
L = u;
__split(tr[u].rs, x, tr[u].rs, R);
}
else
{
R = u;
__split(tr[u].ls, x, L, tr[u].ls);
}
push_up(u);
}
int merge(int x, int y)
{
if (!x || !y) return x + y;
if (tr[x].rand < tr[y].rand)
{
tr[x].rs = merge(tr[x].rs, y);
push_up(x);
return x;
}
else
{
tr[y].ls = merge(x, tr[y].ls);
push_up(y);
return y;
}
}
int get_kth(int rank)
{
int p = root;
while (p)
{
if (tr[tr[p].ls].size + 1 == rank)
break;
else if (tr[tr[p].ls].size >= rank)
p = tr[p].ls;
else
{
rank -= tr[tr[p].ls].size + 1;
p = tr[p].rs;
}
}
return tr[p].val;
}
void insert(int val)
{
root = merge(root, clone(val));
}
}HAN[N], LIE;
signed main()
{
n = read(), m = read(), q = read();
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= m - 1; j ++ )
{
HAN[i].insert((i - 1) * m + j);
}
for (int i = 1; i <= n; i ++ )
LIE.insert(i * m);
for (int i = 1; i <= q; i ++ )
{
int x = read(), y = read();
HAN[x].split(HAN[x].root, y - 1, HAN[x].L, HAN[x].R);
HAN[x].split(HAN[x].R, 1, HAN[x].p, HAN[x].R);
cout << HAN[x].tr[HAN[x].p].val << endl;
HAN[x].root = HAN[x].merge(HAN[x].L, HAN[x].R);
LIE.split(LIE.root, x - 1, LIE.L, LIE.R);
LIE.split(LIE.R, 1, LIE.p, LIE.R);
HAN[x].root = HAN[x].merge(HAN[x].root, LIE.p);
LIE.root = LIE.merge(LIE.L, LIE.merge(LIE.R, HAN[x].p));
}
return 0;
}