列队
树状数组
#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; }