记录编号 477615 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2017]列队 最终得分 100
用户昵称 Gravatar_Itachi 是否通过 通过
代码语言 C++ 运行时间 3.713 s
提交时间 2017-12-05 11:34:48 内存使用 274.95 MiB
显示代码纯文本
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
char cc;inline void R_int(int &x){
	while(cc=getchar(),cc<'!');x=cc-48;
	while(cc=getchar(),cc>'!')x=x*10+cc-48;	
}
#define LL long long
const int maxn=300005<<1,SIZEN=maxn*20;
int n,m,Q,cnt=0,pos,rx[SIZEN],ls[SIZEN],rs[SIZEN],v[SIZEN];
LL qx,ans,num[SIZEN];
int Set(int l,int r){
	if(l>n)return 0;int rt=++cnt;
	if(l==r){num[rt]=l*1ll*m;return rt;}
	int mid=(l+r)>>1;
	ls[rt]=Set(l,mid),rs[rt]=Set(mid+1,r);
	return rt;
}
void Del(int &rt,int l,int r){
	if(!rt)rt=++cnt;
	if(l==r){
		if(!num[rt])ans=-l;else ans=num[rt];
		v[rt]=1;return;
	}
	int mid=(l+r)>>1;
	if(pos<=mid-v[ls[rt]])Del(ls[rt],l,mid);
	else pos+=v[ls[rt]],Del(rs[rt],mid+1,r);
	v[rt]=v[ls[rt]]+v[rs[rt]];
}
LL Del(int x){
	Del(rx[x],1,maxn);
	if(ans<0)return (x-1)*1ll*m-ans;
	return ans;
}
void Add(int &rt,int l,int r){
	if(!rt)rt=++cnt;
	if(l==r){num[rt]=qx;return;}
	int mid=(l+r)>>1;
	if(pos<=mid-v[ls[rt]])Add(ls[rt],l,mid);
	else pos+=v[ls[rt]],Add(rs[rt],mid+1,r);
}
void Run(int x,int y){
	pos=x,qx=Del(0);
	if(y^m)pos=m,Add(rx[x],1,maxn),pos=y,qx=Del(x);
	pos=n,Add(rx[0],1,maxn),printf("%lld\n",qx);
}
int main(){
	freopen("2017phalanx.in","r",stdin);freopen("2017phalanx.out","w",stdout);
	int x,y;R_int(n),R_int(m),R_int(Q);rx[0]=Set(1,maxn);
	while(Q--)R_int(x),R_int(y),Run(x,y);
}