第 1∼6 组数据:0n≤5000,m≤10000。
第 7∼10 组数据:0n≤10000,m≤100000。
第 11∼20 组数据:0n≤200000,m≤2000000。
所有数据都是随机数据。
![技术图片](/img/jia.gif)
#include<bits/stdc++.h> #define lc tr[p].ch[0] #define rc tr[p].ch[1] using namespace std; const int maxn = 2500005, inf=0x3f3f3f3f; int read() { int o=0, f=1; char ch; while(!isdigit(ch=getchar())) if(ch==‘-‘) f=-1; while(isdigit(ch)) o=o*10+ch-‘0‘, ch=getchar(); return o*f; } struct Treap{ int ch[2]; int val, cnt; int siz, rk; } tr[maxn]; void up(int p) { tr[p].siz = tr[lc].siz + tr[rc].siz + 1; } void rotate(int &p, int d) { int son = tr[p].ch[d]; tr[p].ch[d] = tr[son].ch[d^1]; tr[son].ch[d^1] = p; up(p); up(p=son); } int np=0; void insert(int &p, int x) { if(!p) { tr[p=++np] = (Treap){0, 0, x, 1, 1, rand()}; return; } tr[p].siz++; if(tr[p].val == x) { tr[p].cnt++; return; } int d = tr[p].val < x; insert(tr[p].ch[d], x); if(tr[p].rk > tr[tr[p].ch[d]].rk) rotate(p, d); } void del(int &p, int x) { if(!p) return; if(tr[p].val == x) { if(tr[p].cnt > 1) { tr[p].siz--; tr[p].cnt--; return; } if(!lc || !rc) { p = lc + rc; // 利用引用更新父节点指向 return; } int d = tr[rc].rk < tr[lc].rk; rotate(p, d); del(p, x); } else { int d = tr[p].val < x; del(tr[p].ch[d], x); up(p); } } int find(int p, int x) { while(p && tr[p].val != x) if(tr[p].val < x) p=rc; else p=lc; return p; } int Max(int p) { while(p && rc) p=rc; return p; } int Min(int p) { while(p && lc) p=lc; return p; } int pred(int p, int x) { if(!p) return -inf; if(tr[p].val >= x) return pred(lc, x); return max(tr[p].val, pred(rc, x)); } int suc(int p, int x) { if(!p) return inf; if(tr[p].val <= x) return suc(rc, x); return min(tr[p].val, suc(lc, x)); } void prt(int p) { if(!p) return; prt(lc); printf("%d %d %d %d %d\n", p, tr[p].val, tr[p].cnt, lc, rc); prt(rc); } int main() { int n=read(), m=read(), rt=0; while(n--) insert(rt, read()); while(m--) { char op[10]; scanf("%s", op); if(op[0] == ‘I‘) insert(rt, read()); else if(op[0] == ‘D‘) del(rt, read()); else if(op[0] == ‘F‘) puts( find(rt, read())? "Y" : "N"); else if(op[0] == ‘P‘) { int t=pred(rt, read()); if(t != -inf) printf("%d\n", t); } else if(op[0] == ‘S‘) { int t=suc(rt, read()); if(t != inf) printf("%d\n", t); } else if(op[1] == ‘i‘) { if(rt) printf("%d\n", tr[Min(rt)].val); } else { if(rt) printf("%d\n", tr[Max(rt)].val); } } return 0; }
-