mxqz样例不过
查看原帖
mxqz样例不过
708103
封禁用户楼主2022/7/10 08:23

已知问题出在线段树(应该是)

#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;
}
2022/7/10 08:23
加载中...