Description

Black Box是一种原始的数据库。它可以储存一个整数数组,还有一个特别的变量i。最开始的时候Black Box是空的.而i等于0。这个Black Box要处理一串命令。

命令只有两种:

ADD(x):把x元素放进BlackBox;

GET:i加1,然后输出Blackhox中第i小的数。

记住:第i小的数,就是Black Box里的数的按从小到大的顺序排序后的第i个元素。

现在要求找出对于给定的命令串的最好的处理方法。ADD和GET命令分别最多200000个。现在用两个整数数组来表示命令串:

  1. A(1),A(2),…A(M):一串将要被放进Black Box的元素。每个数都是绝对值不超过2000000000的整数,M<=200000。

  2. u(1),u(2),…u(N):表示第u(j)个元素被放进了Black Box里后就出现一个GET命令。输入数据不用判错。

Input&Output

Input

第一行,两个整数,M,N。

第二行,M个整数,表示A(l)......A(M)。

第三行,N个整数,表示u(l)......u(N)。

Output

输出Black Box根据命令串所得出的输出串,一个数字一行。

Sample

Input

7 4
3 1 -4 2 8 -1000 2
1 2 6 6

Output

3
3
1
2

Solution

题目要求支持插入和按排名查询,可以考虑用treap维护。

注意不要一开始插入所有元素,用一个计数器记录当前插入过的最后一个元素,跟随查询指令更新平衡树,再输出答案即可,详见代码。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<ctime>
#include<cstdlib>
#define maxn 200005
using namespace std;
struct node{
    int v,w;
    int l,r;
    int size,k;
    node(){l=r=size=k=0;}
}t[maxn];
int rt,cnt,ans;
void New(int &p,int x)
{
    p=++cnt;
    t[p].v=x;
    t[p].w=rand();
    t[p].size=t[p].k=1;
}
void pushup(int p)
{
    t[p].size=t[t[p].l].size+t[t[p].r].size+t[p].k;
}
void lturn(int &p)
{
    int q=t[p].r;
    t[p].r=t[q].l;t[q].l=p;
    p=q;
    pushup(t[p].l);
    pushup(p);
}
void rturn(int &p)
{
    int q=t[p].l;
    t[p].l=t[q].r;t[q].r=p;
    p=q;
    pushup(t[p].r);
    pushup(p);
}
void Insert(int &p,int x)
{
    if(p==0){
        New(p,x);
        return;
    }
    t[p].size++;
    if(t[p].v==x)t[p].k++;
    else if(t[p].v<x){
        Insert(t[p].r,x);
        if(t[t[p].r].w<t[p].w)lturn(p);
    }
    else {
        Insert(t[p].l,x);
        if(t[t[p].l].w<t[p].w)rturn(p);
    }
}
int query(int p,int x)
{
    if(p==0)return 0;
    else if(x<=t[t[p].l].size)
        return query(t[p].l,x);
    else if(x>t[t[p].l].size+t[p].k)
        return query(t[p].r,x-(t[t[p].l].size+t[p].k));
    else return t[p].v;
}
int n,m,a[maxn],q;
int main()
{
    srand(time(NULL));
    scanf("%d%d",&n,&m);
    int ptr=0;
    for(int i=1;i<=n;++i)scanf("%d",&a[i]);
    for(int j=1;j<=m;++j){
        scanf("%d",&q);
        for(int k=ptr+1;k<=q;++k)
            Insert(rt,a[k]);
        ptr=q;
        printf("%d\n",query(rt,j));
    }
    return 0;
}

[Luogu1801] 黑匣子 - Treap的更多相关文章

  1. luogu1801 黑匣子

    惊了呀 Splay Treap 这都什么玩意 两个优先队列搞定 #include <bits/stdc++.h> using namespace std; #define LL long ...

  2. [日常摸鱼]Luogu1801 黑匣子(NOI导刊)

    题意:写一个数据结构,要求滋兹两种操作,ADD:插入一个数,GET:令$i++$然后输出第$i$小的数 这个数据结构当然是平衡树啦!(雾) 写个Treap直接过掉啦- #include<cstd ...

  3. P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  4. fhq treap最终模板

    新学习了fhq treap,厉害了 先贴个神犇的版, from memphis /* Treap[Merge,Split] by Memphis */ #include<cstdio> # ...

  5. BZOJ 1691: [Usaco2007 Dec]挑剔的美食家 [treap 贪心]

    1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 786  Solved: 391[Submit][S ...

  6. BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 [treap hash]

    1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1318  Solved: 498[Submit][ ...

  7. 非旋treap模板

    bzoj3580 非旋转treap 在大神教导下发现split一段区间时先split右边再split左边比较好写 #include <cstdio> #include <cstdli ...

  8. POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]

    The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8807   Accepted ...

  9. [普通平衡树treap]【学习笔记】

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9046  Solved: 3840[Submit][Sta ...

随机推荐

  1. nginx的自动化安装和启停脚本

    个人原创,转载请注明出处和作者,否则依法追究法律责任 author: headsen chen date:  2018-03-07  14:39:11 nginx_install.sh #!/bin/ ...

  2. linux修改时区

    Linux修改时区 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任 CentOS6: 查看以前的时区: [root@localhost mysq ...

  3. git下载Ardupilot源码

    pwd #确定当前目录 mkdir Copter-3.5.4 #如有需要,新建目录 cd Copter-3.5.4 #进入新目录文件 #克隆指定分支,并且克隆分支对应的git子模块 git clone ...

  4. Centos虚拟机克隆模板

    Centos6模板 IPTABLES/SELINUX # iptalbes -F # service iptables save 或 # /etc/init.d/iptables stop # chk ...

  5. PHP开发程序员的学习路线

    PHP开发程序员的学习路线 兄弟连PHP培训,简单为大家梳理了每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定学习成长目标. 第一阶段:基础阶段(基础PHP程序员) 重点:把LNMP搞熟 ...

  6. Matplotlib库的使用

    *可通过dpi修改输出质量 plot函数 第一种方法会使图中所有的字体改变,而第二种方法只会改变中文字体,推荐使用第二种方法.

  7. ASP.NET MVC编程——错误处理与日记

    ASP.NET MVC的错误处理应考虑到这几个方面:模型绑定期间发生的错误,未能路由到指定操作,针对控制器的错误处理.使用配置文件可以帮助我们处理异常,但是不够灵活和全面:使用HandleErrorA ...

  8. npm 和bower之间的区别

    (一) npm是node js的包管理器,用来下载安装node js的第三方工具包,也可以用来发布你自己开发的工具包.通过npm可以安装bower,命令如下: npm install -g bower ...

  9. 【Flask】微型web框架flask大概介绍

    Flask Flask是一个基于python的,微型web框架.之所以被称为微型是因为其核心非常简单,同时具有很强的扩展能力.它几乎不给使用者做任何技术决定. 安装flask时应该注意其必须的几个支持 ...

  10. CAS 之 Hello World(二)

    CAS 之 Hello World(二) 标签(空格分隔): CAS Intro(介绍) 由上节可知Apereo CAS官方推荐使用 WAR Overlay 的方式进行部署: It is recomm ...