#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=+;
struct node{
int l,r;
int maxx;
int minn;
} tr[N*];
//保存历史记录,被毁的
int history[N*];
int n,m;
void build(int i,int l,int r)
{
tr[i].l=l;
tr[i].r=r;
if(l==r)
{
//初始化
//i到n的最小
tr[i].minn=n+;
//1到i的最大
tr[i].maxx=;
return;
}
int mid=(l+r)>>;
build(i<<,l,mid);
build(i<<|,mid+,r);
tr[i].maxx=max(tr[i*].maxx,tr[i*+].maxx);
tr[i].minn=min(tr[i*].minn,tr[i*+].minn);
}
//更新最小值
void updateMin(int i,int id,int val)
{
if(tr[i].l==tr[i].r)
{
tr[i].minn=val;
return;
}
int mid=tr[i].l+tr[i].r>>;
if(id<=mid)
updateMin(i*,id,val);
else
updateMin(i*+,id,val); tr[i].minn=min(tr[i*].minn,tr[i*+].minn);
}
//更新最大值
void updateMax(int i,int id,int val)
{
if(tr[i].l==tr[i].r)
{
tr[i].maxx=val;
return;
}
int mid=(tr[i].l+tr[i].r)/;
if(id<=mid)
updateMax(i*,id,val);
else
updateMax(i*+,id,val); tr[i].maxx=max(tr[i*].maxx,tr[i*+].maxx);
}
//查询最小值
int queryMin(int i,int ql,int qr)
{
//当前区间在目标区间内
if(ql<=tr[i].l&&qr>=tr[i].r)
return tr[i].minn;
int mid=(tr[i].l+tr[i].r)/;
int res=INF;
if(ql<=mid)
res=min(res,queryMin(i*,ql,qr));
if(qr>mid)
res=min(res,queryMin(i*+,ql,qr));
return res;
}
//查询最大值
int queryMax(int i,int ql,int qr)
{
//当前区间在目标区间内
if(ql<=tr[i].l&&qr>=tr[i].r)
return tr[i].maxx;
int mid=(tr[i].l+tr[i].r)/;
int res=;
if(ql<=mid)
res=max(res,queryMax(i*,ql,qr));
if(qr>mid)
res=max(res,queryMax(i*+,ql,qr));
return res;
}
int main()
{ while(scanf("%d%d",&n,&m)!=EOF)
{
build(,,n);
int cnt=;
memset(history,,sizeof history );
while(m--){
char str[];
scanf("%s",str);
//破坏
if(str[]=='D')
{
int x;
scanf("%d",&x);
//把x对应的值更新成x //初始化时,默认1到x最大到结尾
//x到n最小到开头0 //现在更新为自己, //如果查询的区间包括x,最大最小都会返回x或者其他被毁的
updateMax(,x,x);
updateMin(,x,x);
//记录被毁的
history[++cnt]=x;
}
//查询
else if(str[]=='Q')
{
int x;
scanf("%d",&x);
int maxx=queryMax(,,x);
int minn=queryMin(,x,n);
//特判
//如果最大最小相同,说明自身被毁
if(maxx==minn)
printf("0\n");
else
//从当前点往后的最小,也就是最近的被毁的
//从当前点往前最大的,也就是最近的被毁的
//做差再减去1就是长度
printf("%d\n",minn-maxx-);
}
else
{
//恢复最后被毁的,将对应初始值改回
int temp=history[cnt--];
updateMin(,temp,n+);
updateMax(,temp,);
}
}
}
return ;
}

最新文章

  1. .net学习笔记--文件读写的几种方式
  2. ASP.NET 5系列教程 (四):向视图中添加服务和发布应用到公有云
  3. Java学习-027-JSON 之一 -- 初识
  4. protobuf安装
  5. bzoj 2434: [Noi2011]阿狸的打字机
  6. SAP 增强说明
  7. Json 映射 的使用 及 JS 数组的使用
  8. XTEA加密算法
  9. HDU 2674 N!Again
  10. 了解 : Odata 的 $filter
  11. [自制操作系统] JOS文件系统详解&支持工作路径&MSH
  12. MaterialDesign学习项目
  13. 新浪微博注册(elenium Python 自动化)
  14. [JAVA]字节数组流
  15. Tembin
  16. dos 设置 Windows 网络命令
  17. CLion使用OpenCV(Ubuntu 18.04)
  18. win10 壁纸路径
  19. jenkins 添加 k8s 云
  20. VC编译连接选项详解

热门文章

  1. selenium 操作下拉处理
  2. WeChall_Training: Crypto - Caesar I (Crypto, Training)
  3. Go语言实现:【剑指offer】数组中的逆序对
  4. Generator - Python 生成器
  5. k8s调度器kube-scheduler
  6. centos7使用MySQL的Yum存储库安装mysql5.6.45
  7. 基于已构建S2SH项目配置全注解方式简化配置文件
  8. VS2015中使用qt开发客户端,QPluginLoader加载dll为null的解决办法
  9. scanf函数中*修饰符的作用,如:%*d
  10. ExecutionContext(执行上下文)综述