列队
树状数组
#include<cstdio>
#include<cstring>
#include<algorithm>
#define F(i,a,b) for(int i=a;i<=b;++i)
#define dF(i,a,b) for(int i=a;i>=b;--i)
#define F2(i,a,b) for(int i=a;i<b;++i)
#define getchar() (SS==TT&&(TT=(SS=BB)+fread(BB,1,1<<15,stdin),TT==SS)?EOF:*SS++)
#define RR register
char BB[1<<15],*SS=BB,*TT=BB;
inline int read(){
RR int x;RR bool f;RR char c;
for (f=0; (c=getchar())<'0'||c>'9'; f=c=='-');
for (x=c-'0'; (c=getchar())>='0'&&c<='9'; x=(x<<3)+(x<<1)+c-'0');
return f?-x:x;
}
using namespace std;
int q,I[300010];
long long n,m,a[300010],b[300010];
inline bool cmp(int p1,int p2){return a[p1]==a[p2]?p1<p2:a[p1]<a[p2];}
int h[300010],len[300010],len2[300010],bit[900010];
long long arr[900010];
long long Ans[300010];
inline void Ins(int*array,int siz,int i,int x){for(;i<=siz;array[i]+=x,i+=i&-i);}
inline int binary(int*array,int siz,int x){
int l=1,r,mid,sum,ans;
while(l<=siz&&array[l]<x) l<<=1, ans=l;
r=l; sum=array[l>>=1];
while(l<r-1){
mid=l+r>>1;
if(mid>siz||array[mid]+sum>=x) r=mid, ans=mid;
else l=mid, sum+=array[l];
} ans=r;
return ans;
}
int stk[300001],top;
int main(){
n=read(), m=read(), q=read();
F(i,1,q) a[i]=read(), b[i]=read(), I[i]=i;
sort(I+1,I+q+1,cmp);
F(i,1,m-1) Ins(bit,m-1,i,1);
F(i,1,n) len[i]=m-1;
F(i,1,q){
if(a[I[i-1]]!=a[I[i]])
while(top) Ins(bit,m-1,stk[top--],1);
if(b[I[i]]>len[a[I[i]]]) continue;
int pos=binary(bit,m-1,b[I[i]]);
Ans[I[i]]=(a[I[i]]-1)*m+pos;
Ins(bit,m-1,pos,-1);
stk[++top]=pos;
--len[a[I[i]]];
}
int iter=0;
F(i,1,n){
while(iter<=q&&a[I[iter]]<i) ++iter;
h[i]=iter-1;
}
h[n+1]=q;
memset(bit,0,sizeof bit);
F(i,1,n) len[i]=0, len2[i]=m-1; len[n+1]=n;
F(i,1,n) Ins(bit+h[n+1],n+q,i,1), arr[q+i]=i*m;
F(i,1,q){
if(Ans[i]){
int pos=binary(bit+h[n+1],n+q,a[i]);
Ins(bit+h[n+1],n+q,pos,-1);
Ins(bit+h[n+1],n+q,++len[n+1],1);
arr[h[n+1]+len[n+1]]=Ans[i];
Ins(bit+h[a[i]],h[a[i]+1]-h[a[i]],++len[a[i]],1);
arr[h[a[i]]+len[a[i]]]=arr[h[n+1]+pos];
--len2[a[i]];
}
else{
int pos=binary(bit+h[n+1],n+q,a[i]);
Ins(bit+h[n+1],n+q,pos,-1);
Ins(bit+h[n+1],n+q,++len[n+1],1);
if(b[i]!=m){
int pos2=binary(bit+h[a[i]],h[a[i]+1]-h[a[i]],b[i]-len2[a[i]]);
Ins(bit+h[a[i]],h[a[i]+1]-h[a[i]],pos2,-1);
Ans[i]=arr[h[a[i]]+pos2];
Ins(bit+h[a[i]],h[a[i]+1]-h[a[i]],++len[a[i]],1);
arr[h[a[i]]+len[a[i]]]=arr[h[n+1]+pos];
} else Ans[i]=arr[h[n+1]+pos];
arr[h[n+1]+len[n+1]]=Ans[i];
}
}
F(i,1,q) printf("%lld\n",Ans[i]);
return 0;
}

浙公网安备 33010602011771号