一、题目
二、解法
每个编号都赋一个权值,然后就可以放进 treap \text{treap} treap 里了。
我们需要存每个编号对应的值和每一个值对应的编号。
对于 top,bottom \text{top,bottom} top,bottom 操作,我们修改权值,把原权值删除,再把最大权 / / /最小权作为新的权值。
对于 insert \text{insert} insert 操作,取出前驱 / / /后继然后交换一下权值。
然后就可以用有旋 treap \text{treap} treap做这道题了,时间复杂度 O ( n log n ) O(n\log n) O(nlogn)。
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <ctime>
#define inf 0x3f3f3f3f
using namespace std;
const int MAXN = 200005;
int read()
{
int x=0,flag=1;char c;
while((c=getchar())<'0' || c>'9') if(c=='-') flag=-1;
while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*flag;
}
int n,m,rt,x,head,tail,Index,v[MAXN],mp[MAXN*3];
int ch[MAXN][2],cnt[MAXN],siz[MAXN],val[MAXN],hp[MAXN];
void push_up(int x)
{
siz[x]