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. 一个类似抖音 APP 拍摄按钮效果的控件

    TouchButton 一个类似抖音 APP 拍摄按钮效果的控件 效果图预览 用法 <net.angrycode.library.TouchButton android:id="@+i ...

  2. Filecoin: 影响力容错(PFT)和预期共识(EC)

    名字翻译:Power Fault Tolerance-影响力容错 关于这个名字翻译,小编思考了大约2周时间,期间也跟各路技术牛人进行了交流. The Power Fault Tolerance mod ...

  3. threejs - uv 映射 简要

    啥也不说先上way+code+demo; https://github.com/Thinkia/threejs_/blob/master/test/test2-%20uv/readme.md 如何理解 ...

  4. 笔记:Struts2 的 JSON 插件

    安装插件,将其复制到Web应用的WEB-INF/lib 目录下 Struts2-json-plugin-2.3.16.3.jar json-lib-2.3-jdk15.jar commons-bean ...

  5. return false与return true的区别

    <a href="http://www.baidu.com" onclick="alert(11);return true;alert(22)">链 ...

  6. 前端的UI设计与交互之图标篇

    图标是具有指代意义的图形,也是一种标识.通过使用图标表达命令,强调状态,表示产品或类别.为了系统及跨平台之间图形认知保持一致, 图标在设计和使用时有以下两个原则点需要注意:简单的图形语言以及高辨识度. ...

  7. node命令curl

    一.打开另一个命令行窗口,运行下面的命令. curl -X POST --data "name=Jack" 127.0.0.1:3000 上面代码使用 POST 方法向服务器发送一 ...

  8. 浅析Python多线程

    学习Python多线程的资料很多,吐槽Python多线程的博客也不少.本文主要介绍Python多线程实际应用,且假设读者已经了解多线程的基本概念.如果读者对进程线程概念不甚了解,可参见知名博主 阮一峰 ...

  9. Java多线程:死锁

    周末看到一个用jstack查看死锁的例子.昨天晚上总结了一下jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令.供大家参考  1.Jstack 1.1 jstack能得到运行j ...

  10. js中非死循环引起的栈调用溢出问题

    一般情况下,仅从代码上看只要不出现死循环,是不会出现堆栈调用溢出的.但是某些情况下列外,比如下面这段代码: var a = 99; function b (){ a --; if (a > 0) ...