传送门

很神奇的一道题,可以用线段树搞,为了练习treap所以拿treap写了。

其实根据询问,删除那个标号就加入平衡树,然后找到最大的和最小的就好了。

一些很烦人的小细节。

 //POJ 2892
 //by Cydiater
 //2016.9.1
 #include <iostream>
 #include <cstdio>
 #include <cstdlib>
 #include <cstring>
 #include <string>
 #include <queue>
 #include <map>
 #include <ctime>
 #include <cmath>
 #include <iomanip>
 #include <algorithm>
 using namespace std;
 #define ll long long
 #define up(i,j,n)        for(int i=j;i<=n;i++)
 #define down(i,j,n)        for(int i=j;i>=n;i--)
 ;
 const int oo=0x3f3f3f3f;
 inline int read(){
     ,f=;
     ;ch=getchar();}
     +ch-';ch=getchar();}
     return x*f;
 }
 ,root=,destory_list[MAXN],top=,last_add,maxx,minn;
 char op;
 bool vis[MAXN];
 struct node{
     int leftt,rightt,v,rnd,siz,cnt;
 }t[MAXN];
 namespace solution{
     void updata(int k){
         t[k].siz=t[t[k].leftt].siz+t[t[k].rightt].siz+t[k].cnt;
     }
     void lefturn(int &k){
         int tt=t[k].rightt;t[k].rightt=t[tt].leftt;t[tt].leftt=k;
         t[tt].siz=t[k].siz;updata(k);k=tt;
     }
     void righturn(int &k){
         int tt=t[k].leftt;t[k].leftt=t[tt].rightt;t[tt].rightt=k;
         t[tt].siz=t[k].siz;updata(k);k=tt;
     }
     void insert(int &k,int x){
         ){
             k=++tol;t[k].leftt=t[k].rightt=;
             t[k].siz=;t[k].v=x;t[k].cnt=;
             t[k].rnd=rand();
             return;
         }
         t[k].siz++;
         if(x==t[k].v)t[k].cnt++;
         else if(x>t[k].v){
             insert(t[k].rightt,x);
             if(t[t[k].rightt].rnd<t[k].rnd)lefturn(k);
         }else if(x<t[k].v){
             insert(t[k].leftt,x);
             if(t[t[k].leftt].rnd<t[k].rnd)righturn(k);
         }
     }
     void del(int &k,int x){
         )    return;
         if(x==t[k].v){
             ){t[k].cnt--;return;}
             )k=t[k].leftt+t[k].rightt;
             else if(t[t[k].leftt].rnd<t[t[k].rightt].rnd){
                 righturn(k);
                 del(k,x);
             }else if(t[t[k].leftt].rnd>t[t[k].rightt].rnd){
                 lefturn(k);
                 del(k,x);
             }
         }else if(x<t[k].v){
             t[k].siz--;
             del(t[k].leftt,x);
         }else if(x>t[k].v){
             t[k].siz--;
             del(t[k].rightt,x);
         }
     }
     void query_delta(int k,int x){
         )return;
         if(t[k].v>=x&&t[k].v<maxx)maxx=t[k].v;
         if(t[k].v<=x&&t[k].v>minn)minn=t[k].v;
         if(x>t[k].v)query_delta(t[k].rightt,x);
         else        query_delta(t[k].leftt,x);
     }
     void slove(){
         N=read();M=read();
         memset(vis,,sizeof(vis));
         while(M--){
             scanf("%c",&op);
             if(op=='R'){
                 )continue;
                 last_add=destory_list[top--];
                 del(root,last_add);
                 scanf("\n");
                 continue;
             }
             num=read();
             if(op=='D'){insert(root,num);destory_list[++top]=num;}
             if(op=='Q'){
                 maxx=N+;minn=;
                 query_delta(root,num);
                 ");
                 );
             }
         }
     }
 }
 int main(){
     //freopen("input.in","r",stdin);
     using namespace solution;
     slove();
     ;
 }

最新文章

  1. jQuery操作Table tr td常用的方法
  2. 七牛php sdk 生成上传凭证时出现 undefined function Qiniu_SetKeys()
  3. git checkout 命令详解
  4. Android 中 Service AIDL使用
  5. JS获取系统的指定定年月日
  6. UISlide
  7. 函数参数选项的处理getopt getopt_long getopt_long_only
  8. Smokeping 监控部署及配置
  9. pragma comment的使用
  10. Android - Fragment(二)加载Fragment
  11. Log4Net(一):快速入门
  12. jsonArray与 jsonObject区别与js取值
  13. Oracle EBS BOM模块常用表结构
  14. DNS Tunnel隧道隐蔽通信实验 &amp;&amp; 尝试复现特征向量化思维方式检测
  15. dotNet程序员的Java爬坑之旅(三)之spring MVC篇一
  16. JVM:Java常见内存溢出异常分析
  17. 9foundation
  18. Navicat for MYSQL 断网时本地连接无法打开,2005错误
  19. 回文数的golang实现
  20. 讲讲我当年是怎么拿到AI研发公司offer的

热门文章

  1. JavaScript UI选型及Jquery EasyUI使用经验谈
  2. js的数组
  3. matlab eps
  4. C#实现清理系统内存
  5. android之拍照与摄像
  6. [转]论acm与泡妞
  7. 【Alpha版本】冲刺阶段——Day 6
  8. 【UR #2】树上GCD
  9. Boundary Representations
  10. 【深入Java虚拟机】之一:Java内存模型与内存溢出