题目思路:splay,用到了查找树内某结点的前驱,后继和插入操作。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<queue>
#include<algorithm>
#include<vector>
#include<stack>
#include<list>
#include<iostream>
#include<map>
using namespace std;
#define inf 0x3f3f3f3f
#define Max 40000
int max(int a,int b)
{
return a>b?a:b;
}
int min(int a,int b)
{
return a<b?a:b;
}
int p[Max],ch[Max][2],val[Max],root,top1;
inline void newnode(int &x,int fa,int data)
{
x=++top1;
p[x]=fa,val[x]=data;
ch[x][0]=ch[x][1]=0;
}
inline void rot(int x,int f)
{
int y=p[x];
ch[y][!f]=ch[x][f];
p[ch[x][f]]=y;
if(p[y]) ch[p[y]][ch[p[y]][1]==y]=x;
p[x]=p[y];
ch[x][f]=y;
p[y]=x;
}
inline void splay(int x,int goal)
{
while(p[x]!=goal)
{
if(p[p[x]]==goal)