zoukankan      html  css  js  c++  java
  • 集训·列队

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int N=300005;
    inline int read()
    {
    	int x=0,f=1;char c=getchar();
    	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    	return x*f;
    }
    int n,m,q,u,v,tot,rt[N<<4],cnt,lson[N<<4],rson[N<<4],sum[N<<4],pos;
    std::vector<int> pb[N];
    inline int query(int now,int l,int r,int val)
    {
    	if(l==r)return l;
    	int mid=((l+r)>>1),tmp=mid-l+1-sum[lson[now]];
    	if(val<=tmp)return query(lson[now],l,mid,val);
    	return query(rson[now],mid+1,r,val-tmp);
    }
    inline void modify(int &now,int l,int r)
    {
    	if(!now)now=++cnt;
    	sum[now]++;
    	if(l==r)return;
    	int mid=((l+r)>>1);
    	if(pos<=mid)modify(lson[now],l,mid);
    	else modify(rson[now],mid+1,r);
    }
    inline int sp_sol(int x,int y)
    {
    	pos=query(rt[n+1],1,tot,x);
    	modify(rt[n+1],1,tot);
    	int ans;
    	if(pos<=n)ans=pos*m;
    	else ans=pb[n+1][pos-n-1];
    	if(y)pb[n+1].push_back(y);
    	else pb[n+1].push_back(ans);
    	return ans;
    }
    inline int sol(int x,int y)
    {
    	pos=query(rt[x],1,tot,y);
    	modify(rt[x],1,tot);
    	int ans;
    	if(pos<m)ans=(x-1)*m+pos;
    	else ans=pb[x][pos-m];
    	pb[x].push_back(sp_sol(x,ans));
    	return ans;
    }
    signed main(signed argc, char const *argv[])
    {
    //	freopen("phalanx.in","r",stdin);
    //	freopen("phalanx.out","w",stdout);
    	n=read();m=read();q=read();
    	tot=max(n,m)+q;
    	while(q--)
    	{
    		u=read();v=read();
    		if(v==m)cout<<sp_sol(u,0)<<endl;
    		else cout<<sol(u,v)<<endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    最近这段时间
    一元多项式的
    珍藏
    运行命令大全
    Google
    Windows Live Writer插件
    Word写论文的技
    安装Windows Live Writer后Ƃ
    比尔盖茨给人
    不经意的感悟
  • 原文地址:https://www.cnblogs.com/Ace-MYX/p/11678651.html
Copyright © 2011-2022 走看看