POJ 1442 Treap模板

// by SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int cnt=0,jy,a[30500],n,m,root=-1;
struct node{
    int left,right,count_left,count_right,key,priority;
}treap[30500];
void zig(int &x){
    int y=treap[x].right;
    treap[x].right=treap[y].left;
    treap[x].count_right=treap[y].count_left;
    treap[y].left=x;
    treap[y].count_left=treap[x].count_left+treap[x].count_right+1;
    x=y;
}
void zag(int &x){
    int y=treap[x].left;
    treap[x].left=treap[y].right;
    treap[x].count_left=treap[y].count_right;
    treap[y].right=x;
    treap[y].count_right=treap[x].count_left+treap[x].count_right+1;
    x=y;
}
void insert(int &x,int new_key){
    if(x==-1){
        x=cnt++;
        treap[x].left=treap[x].right=-1;
        treap[x].priority=rand();
        treap[x].key=new_key;
        treap[x].count_left=treap[x].count_right=0;
    }
    else if(new_key<treap[x].key){
        treap[x].count_left++;
        insert(treap[x].left,new_key);
        if(treap[x].priority>treap[treap[x].left].priority)zag(x);
    }
    else{
        treap[x].count_right++;
        insert(treap[x].right,new_key);
        if(treap[x].priority>treap[treap[x].right].priority)zig(x);
    }
}
int query(int &x,int k_th){
    if(treap[x].count_left+1==k_th)return treap[x].key;
    if(treap[x].count_left+1<k_th)return query(treap[x].right,k_th-treap[x].count_left-1);
    return query(treap[x].left,k_th);
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=m;i++){
        scanf("%d",&jy);
        while(cnt<jy)insert(root,a[cnt+1]);
        printf("%d
",query(root,i));
    }
}

这里写图片描述

原文地址:https://www.cnblogs.com/SiriusRen/p/6532417.html