#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<cmath>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=;
using namespace std;
int lsum[maxn<<],rsum[maxn<<],sum[maxn<<];
int cover[maxn<<],st[maxn],ed[maxn];
set<int>s;
set<int>::iterator itr;
void pushUp(int rt,int m)
{
rsum[rt]=rsum[rt<<|];
lsum[rt]=lsum[rt<<];
if(lsum[rt]==(m-(m>>)))
lsum[rt]=lsum[rt]+lsum[rt<<|];
if(rsum[rt]==m>>)
rsum[rt]=rsum[rt]+rsum[rt<<];
sum[rt]=max(rsum[rt<<]+lsum[rt<<|],max(sum[rt<<],sum[rt<<|]));
}
void pushdown(int rt,int m)
{
if(cover[rt]!=){
cover[rt<<]=cover[rt<<|]=cover[rt];
sum[rt<<]=lsum[rt<<]=rsum[rt<<]=cover[rt]!=-?:m-(m>>);
sum[rt<<|]=lsum[rt<<|]=rsum[rt<<|]=cover[rt]!=-?:m>>;
cover[rt]=;
}
}
void build(int l,int r,int rt)
{
sum[rt]=lsum[rt]=rsum[rt]=r-l+;
cover[rt]=-;
if(l==r) return ;
int m=(l+r)>>;
build(lson);
build(rson);
pushUp(rt,r-l+);
}
int query(int d,int l,int r,int rt)
{
if(l==r) return l;
pushdown(rt,r-l+);
int m=(l+r)>>;
if(sum[rt<<]>=d) return query(d,lson);
else if(rsum[rt<<]+lsum[rt<<|]>=d) return m-rsum[rt<<]+;
return query(d,rson);
}
void update(int d,int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R){
sum[rt]=lsum[rt]=rsum[rt]=d>?:r-l+;
cover[rt]=d;
return;
}
int m=(l+r)>>;
pushdown(rt,r-l+);
if(L<=m) update(d,L,R,lson);
if(R>m) update(d,L,R,rson);
pushUp(rt,r-l+);
}
int getID(int d,int l,int r,int rt)
{
if(cover[rt]) return cover[rt];
int m=(l+r)>>;
if(d<=m) return getID(d,lson);
else return getID(d,rson);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
s.clear();
build(,n,);
for(int i=;i<=m;i++){
char str[];
int d;
scanf("%s",str);
if(str[]=='N'){
scanf("%d",&d);
if(d>sum[])
printf("Reject New\n");
else{
int a=query(d,,n,);
st[i]=a;ed[i]=a+d-;
s.insert(a);
update(i,a,a+d-,,n,);
printf("New at %d\n",a);
}
}
if(str[]=='F')
{
scanf("%d",&d);
int state=getID(d,,n,);
if(state==-) printf("Reject Free\n");
else
{
update(-,st[state],ed[state],,n,);
s.erase(st[state]);
printf("Free from %d to %d\n",st[state],ed[state]);
}
}
if(str[]=='G'){
scanf("%d",&d);
int num=;
for(itr=s.begin();itr!=s.end();itr++){
num++;
if(num==d){
printf("Get at %d\n",*itr);
break;
}
}
if(num<d) printf("Reject Get\n");
}
if(str[]=='R') {
cover[]=-;
sum[]=lsum[]=rsum[]=n;
s.clear();
printf("Reset Now\n");
}
}
printf("\n");
}
return ;
}

最新文章

  1. ListView 的优化
  2. python __call__内置函数
  3. 安装docker管理工具rancher
  4. scanf与scanf_s的区别
  5. 源代码tfs to git
  6. Android动画及图片的缩放和旋转
  7. SPI试验---verilog(实用单通模式)
  8. 用excel处理重复数据
  9. 传说中的WCF(10):消息拦截与篡改
  10. 一道JAVA经典面试题目的两种解法
  11. MyEclipse导入ant项目——Java编程思想
  12. SpringMVC handleMapping 处理器映射器 属性清单
  13. ssm框架搭建的基本配置(一站式教会你搭建)
  14. linux dns域名缓存
  15. 图像之王ImageMagick
  16. 使用matplotlib.pylab绘制分段函数
  17. C#网络编程技术微软Socket实战项目演练(三)
  18. js 取消事件冒泡
  19. Eigen矩阵基本运算
  20. Request库学习

热门文章

  1. 极路由4pro安装java(Jamvm 2.0.0 + gnu classpath 0.9.8)
  2. Microsoft Updateclient更新
  3. JDBC创建mysql连接池代码
  4. HTML打开摄像头,进行拍照上传
  5. 禁掉Apache web server签名 How to turn off server signature on Apache web server
  6. RedHat6.5 安装OpenStack all in one-RDO方式
  7. Android This Activity already has an action bar supplied by the window decor
  8. CoreData(数据库升级 )版本迁移-iOS App升级安装
  9. composer是什么
  10. 有关马氏距离和hinge loss的学习记录