列队

题面

树状数组

 #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;
}

  

posted @ 2019-09-24 23:35  [jackeylove]  阅读(148)  评论(0)    收藏  举报