题目链接: https://vjudge.net/problem/UVA-501
题意:给你两个序列,第一个序列为需要维护的序列,第二个序列x1,x2,x3...xi表示从第一个序列的前xi个数中取出第i小的数。
思路:建立一棵Treap树用于维护序列即可。
//#include<bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#define rep(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int maxn = 1e5+50;
struct node{
int left;
int right;
int key;
int val;
int sz;
}Tree[maxn*2];
int tot;
void add(int val){
++tot;
Tree[tot].key = rand();
Tree[tot].val = val;
Tree[tot].sz = 1;
Tree[tot].left = Tree[tot].right = 0;
}
void update(int now){
int left = Tree[now].left;
int right = Tree[now].right;
Tree[now].sz = Tree[left].sz + Tree[right].sz + 1;
}
void split(int now, int val, int &a, int &b){
if(now == 0){
a = b = 0;
return;
}
if(Tree[now].val <= val){
a = now;
split(Tree[now].right, val, Tree[a].right, b);
}else{
b = now;
split(Tree[now].left, val, a, Tree[b].left);
}
update(now);
}
int Find(int now, int sz){
// int left = Tree[now].left;
// int right = Tree[now].right;
//
// if(Tree[left].sz == sz){
// return Tree[now].val;
// }else if(Tree[left].sz > sz){
// Find(Tree[now].left, sz);
// }else if(Tree[left].sz < sz){
// Find(Tree[now].right, sz-Tree[left].sz-1);
// }
while(Tree[Tree[now].left].sz != sz){
if(Tree[Tree[now].left].sz < sz){
sz -= Tree[Tree[now].left].sz+1;
now = Tree[now].right;
}else{
now = Tree[now].left;
}
}
return Tree[now].val;
}
void merge(int &now, int a, int b){
if(a == 0||b==0){
now = a+b;
return;
}
if(Tree[a].key <= Tree[b].key){
now = a;
merge(Tree[now].right, Tree[a].right, b);
}else{
now = b;
merge(Tree[now].left, a, Tree[b].left);
}
update(now);
}
int n, m, t;
int A[maxn];
int U[maxn];
int main(){
cin >> t;
int flag = 0;
while(t--){
if(flag) cout <<endl;
flag = 1;
int x = 0, y = 0;
int root = 0;
cin >> n >> m;
rep(i, 1, n)
cin >> A[i];
int k = 1;
rep(i, 1, m)
{
cin >> U[i];
while(k <= U[i])
{
split(root,A[k],x,y);
add(A[k]);
merge(root, tot, y);
merge(root, x, root);
k++;
}
int ans = Find(root, i-1);
// int ans = 0;
cout << ans <<endl;
}
tot = 0;
memset(Tree, 0, sizeof(node)*n);
}
return 0;
}