已知问题出在线段树(应该是)
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct Segment_Tree
{
int del,ls,rs;
}tree[50000005];
int rt[3000005],tot=0;
vector<int> vec[300005];
int work(int &p,int l,int r,int k)
{
if(!p)p=++tot;
tree[p].del++;
if(l==r)return l;
int ls=tree[p].ls,rs=tree[p].rs,mid=(l+r)>>1;
int cntl=(mid-l+1)-tree[ls].del;
if(cntl>=k)return work(ls,l,mid,k);
else return work(rs,mid+1,r,k-cntl);
}
signed main()
{
int n,m,q;
scanf("%lld %lld %lld",&n,&m,&q);
while(q--)
{
int x,y;
scanf("%lld %lld",&x,&y);
if(y!=m)
{
int t=work(rt[x],1,m-1+q,y);
// cout<<t<<" ";
if(t<=m-1)vec[0].push_back((x-1)*m+t);
else vec[0].push_back(vec[x][t-(m-1)-1]);
t=work(rt[0],1,n+q,x);
// cout<<t<<"\n";
if(t<=n)vec[x].push_back(t*m);
else vec[x].push_back(vec[0][t-n-1]);
}
else
{
int t=work(rt[0],1,n+q,x);
// cout<<t<<"\n";
if(t<=n)vec[0].push_back(t*m);
else vec[0].push_back(vec[0][t-n-1]);
}
printf("%lld\n",*(--vec[0].end()));
}
return 0;
}