集训·列队

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=300005;
inline int read()
{
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return x*f;
}
int n,m,q,u,v,tot,rt[N<<4],cnt,lson[N<<4],rson[N<<4],sum[N<<4],pos;
std::vector<int> pb[N];
inline int query(int now,int l,int r,int val)
{
	if(l==r)return l;
	int mid=((l+r)>>1),tmp=mid-l+1-sum[lson[now]];
	if(val<=tmp)return query(lson[now],l,mid,val);
	return query(rson[now],mid+1,r,val-tmp);
}
inline void modify(int &now,int l,int r)
{
	if(!now)now=++cnt;
	sum[now]++;
	if(l==r)return;
	int mid=((l+r)>>1);
	if(pos<=mid)modify(lson[now],l,mid);
	else modify(rson[now],mid+1,r);
}
inline int sp_sol(int x,int y)
{
	pos=query(rt[n+1],1,tot,x);
	modify(rt[n+1],1,tot);
	int ans;
	if(pos<=n)ans=pos*m;
	else ans=pb[n+1][pos-n-1];
	if(y)pb[n+1].push_back(y);
	else pb[n+1].push_back(ans);
	return ans;
}
inline int sol(int x,int y)
{
	pos=query(rt[x],1,tot,y);
	modify(rt[x],1,tot);
	int ans;
	if(pos<m)ans=(x-1)*m+pos;
	else ans=pb[x][pos-m];
	pb[x].push_back(sp_sol(x,ans));
	return ans;
}
signed main(signed argc, char const *argv[])
{
//	freopen("phalanx.in","r",stdin);
//	freopen("phalanx.out","w",stdout);
	n=read();m=read();q=read();
	tot=max(n,m)+q;
	while(q--)
	{
		u=read();v=read();
		if(v==m)cout<<sp_sol(u,0)<<endl;
		else cout<<sol(u,v)<<endl;
	}
	return 0;
}
posted @ 2019-10-15 16:41  アインツベルン  阅读(100)  评论(0编辑  收藏  举报
Live2D