#include<iostream> #include<cstring> #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<deque> #include<list> #include<algorithm> #include<stdio.h> #include<iomanip> #define rep(i,n) for(int i=0;i<n;++i) #define fab(i,a,b) for(int i=a;i<=b;++i) #define fba(i,b,a) for(int i=b;i>=a;--i) #define PB push_back #define INF 0x3f3f3f3f #define MP make_pair #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define sf scanf #define pf printf #define LL long long #define lowbit(x) x&-x const int N=51005; using namespace std; typedef pair<int,int>PII; int n,Q; int C[N]; set<int>S[N]; int ed[N],st[N<<2],len[N<<2]; int stlen,edlen; void build(int l,int r,int rt){ st[rt]=INF; if(l==r)S[l].clear(); else{ int m=(l+r)>>1; build(lson); build(rson); } } void add(int x,int d){ while(x<=n){ C[x]+=d; x+=lowbit(x); } } int sum(int x){ int ret=0; while(x){ ret+=C[x]; x-=lowbit(x); } return ret; } int Kth(int k){ int ind=0; for(int i=20;i>=0;i--){ ind^=(1<<i); if(ind<n&&k>C[ind])k-=C[ind]; else ind^=(1<<i); } return ind+1; } /*int Kth(int k){ int L=0,R=n; while(L+1<R){ int M=L+(R-L)/2; if(sum(M)>=k)R=M; else L=M; } return R; }*/ void init(){ sf("%d%d",&n,&Q); memset(C,0,sizeof C); build(1,n,1); stlen=edlen=n; } void push_up(int rt){ if(st[rt<<1]<st[rt<<1|1]){ st[rt]=st[rt<<1]; len[rt]=len[rt<<1]; }else{ st[rt]=st[rt<<1|1]; len[rt]=len[rt<<1|1]; } } void update(int v,int p,bool add,int l,int r,int rt){ if(l==r){ if(add)S[l].insert(v); else S[l].erase(v); if(S[l].size()==0)st[rt]=INF; else{ st[rt]=*(S[l].begin()); len[rt]=l; } }else{ int m=(l+r)>>1; if(p<=m)update(v,p,add,lson); else update(v,p,add,rson); push_up(rt); } } PII qurry(int L,int R,int l,int r,int rt){ if(L<=l&&r<=R) return MP(st[rt],len[rt]); else{ int m=(l+r)>>1; PII ret1=MP(INF,0),ret2=MP(INF,0); if(L<=m)ret1=qurry(L,R,lson); if(R>m)ret2=qurry(L,R,rson); if(ret1.first<ret2.first)return ret1; else return ret2; } } //guarteen can get int getst(int st,int len,int m,int a,int b){ int ed=st+len-1; return max(ed-m-b+1,st); } void solve(){ while(Q--){ char op[10]; sf("%s",op); if(op[0]=='A'){ int m,a,b; sf("%d%d%d",&m,&a,&b); if(stlen>=m){ if(stlen==n){ ed[1]=m; add(1,1); stlen=0; edlen-=m; pf("%d\n",1); }else{ int id=getst(1,stlen,m,a,b); ed[id]=id+m-1; add(id,1); pf("%d\n",id); if(ed[id]+1<=stlen)update(ed[id]+1,stlen-ed[id],1,1,n,1); stlen=id-1; } }else{ PII ret=qurry(m,m+a+b,1,n,1); if(ret.first!=INF){ update(ret.first,ret.second,0,1,n,1); int id=getst(ret.first,ret.second,m,a,b); ed[id]=id+m-1; add(id,1); pf("%d\n",id); int len=id-1-ret.first+1; int p=ret.first; if(ret.first<=id-1)update(p,len,1,1,n,1); p=ed[id]+1; len=ret.first+ret.second-1; if(p<=len)update(p,len-p+1,1,1,n,1); }else{ if(edlen<m)pf("-1\n"); else{ int id=n-edlen+1; ed[id]=id+m-1; edlen=n-ed[id]; add(id,1); pf("%d\n",id); } } } }else{ int k; sf("%d",&k); int sumn=sum(n); if(k>sumn||k<=0)continue; int id=Kth(k); int id1=1; if(k>1)id1=ed[Kth(k-1)]+1; int len1=id-id1; if(len1>0&&id1!=1)update(id1,len1,0,1,n,1); int id2=n; int len2=0; if(k<sumn){ id2=Kth(k+1)-1; len2=id2-ed[id]; } if(len2>0&&id2!=n)update(ed[id]+1,len2,0,1,n,1); if(id1!=1&&id2!=n)update(id1,id2-id1+1,1,1,n,1); if(id1==1)stlen=id2; if(id2==n)edlen=n-id1+1; add(id,-1); } } } int main(){ int T;sf("%d",&T); rep(cas,T){ init(); pf("Case #%d:\n",cas+1); solve(); } return 0; }
转载于:https://www.cnblogs.com/wanggp3/p/4102958.html