思路

对于这些操作全可以放到树状数组上进行,我们用权值记录,到了哪个位子有多少个数,假如要删除,我们直接二分query那个位子就好了,然后把那个点标记成-1,然后输出的时候-1就不输出,其他就输出..

代码

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,m,c[N],ans[N],a[N],id,sum,now[N];
int lowbit(int x)    {    return x&(-x);    }
void add(int u,int val)
{
    while(u<=m)
    {
        c[u]+=val;
        u+=lowbit(u);
    }
}

int query(int u)
{
    int res=0;
    while(u)
    {
        res+=c[u];
        u-=lowbit(u);
    }return res;
}

int work(int u)
{
    int l=1,r=m,ans=2e9;
    while(l<=r)
    {
        int mid=(l+r)>>1;
        if(query(mid)>=u)
        {
            r=mid-1;
            ans=min(ans,mid);
        }
        else l=mid+1;
    }return ans;
}

int main()
{
    cin>>m>>n;
    for(int i=1;i<=n;i++)    scanf("%d",&a[i]);
    for(int i=1;i<=m;i++)
    {
        int x;scanf("%d",&x);
        if(x==0||x==1)
        {
            ans[++id]=x;
            add(id,1),sum++;
        }
        else
        {
            int cnt=lower_bound(a+1,a+1+n,sum)-a;
            if(cnt>n)    cnt--;
            else if(a[cnt]>sum)    cnt--;
            sum-=cnt;
            for(int i=1;i<=cnt;i++)
                now[i]=work(a[i]);
            for(int i=1;i<=cnt;i++)
            {
                add(now[i],-1);
                ans[now[i]]=-1;
            }
        }
    }bool flag=false;
    for(int i=1;i<=id;i++)
    {
        if(ans[i]==-1)    continue;
        flag=true;
        cout<<ans[i];
    }if(!flag)    cout<<"Poor stack!";
    puts("");
    return 0;
}