treap修订
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<ctime>
#include<queue>
#include<cctype>
#include<cstring>
#include<iostream>
#define PAU putchar(' ')
#define ENT putchar('\n')
#define CH for(int d=0;d<=1;d++) if(ch[d])
using namespace std;
const int maxn=+;
struct node{
node*ch[];int r,v,siz;
void init(){r=rand();siz=;ch[]=ch[]=NULL;return;}
void update(){siz=;CH{siz+=ch[d]->siz;}return;}
}treap[maxn],*root[maxn],*nodecnt=treap;
queue<node*>RAM;
node*newnode(){
node*x;
if(!RAM.empty()) x=RAM.front(),RAM.pop();
else x=nodecnt++;
x->init();return x;
}
void del(node*&x){RAM.push(x);return;}
void rotate(node*&x,int d){
node*k=x->ch[d^];x->ch[d^]=k->ch[d];k->ch[d]=x;
x->update();k->update();x=k;return;
}
void insert(node*&x,int v){
if(!x) x=newnode(),x->v=v;
else{
int d=v>x->v;insert(x->ch[d],v);
if(x->ch[d]->r>x->r) rotate(x,d^);
else x->update();
} return;
}
void remove(node*&x,int v){
if(x->v==v){
if(x->ch[]&&x->ch[]){
int d=x->ch[]->r>x->ch[]->r;
rotate(x,d);remove(x->ch[d],v);
}
else{
node*k=x;
if(x->ch[]) x=x->ch[];
else x=x->ch[];
del(k);
}
}
else remove(x->ch[v>x->v],v);
if(x) x->update();return;
}
void print(node*&x){
if(!x) return;
print(x->ch[]);
printf("%d ",x->v);
print(x->ch[]);
return;
}
int find(node*x,int rank){
if(x->siz<rank||rank<) return -;
int kth=x->ch[]?x->ch[]->siz+:;
if(kth==rank) return x->v;
if(kth>rank) return find(x->ch[],rank);
else return find(x->ch[],rank-kth);
}
int fa[maxn];
int findset(int x){return x==fa[x]?x:fa[x]=findset(fa[x]);}
void merge(node*&x,node*&y){
if(!y)return;if(!x){x=y;del(y);return;}
merge(x,y->ch[]);
merge(x,y->ch[]);
insert(x,y->v);
return;
}
void merge(int a,int b){
a=findset(a);b=findset(b);
if(a==b) return;
if(root[a]->siz<root[b]->siz) swap(a,b);
merge(root[a],root[b]);fa[b]=a;
return;
}
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')sig=-;ch=getchar();}
while(isdigit(ch))x=*x+ch-'',ch=getchar();
return x*=sig;
}
inline char readc(){
char ch=getchar();
while(!isalpha(ch)) ch=getchar();
return ch;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
int len=,buf[];while(x)buf[len++]=x%,x/=;
for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
}
int n,q,v[maxn];
void init(){
srand(time());
n=read();q=read();
for(int i=;i<=n;i++) root[i]=newnode(),v[i]=root[i]->v=read(),fa[i]=i;
return;
}
void work(){
int a,b;char tp;
while(q--){
tp=readc();a=read();b=read();
if(tp=='b') merge(a,b);
else if(tp=='q') write(find(root[findset(a)],b)),ENT;
else{
remove(root[findset(a)],v[a]);
insert(root[findset(a)],b);
v[a]=b;
}
}
return;
}
void print(){
return;
}
int main(){init();work();print();return ;}
treap修订的更多相关文章
- fhq treap最终模板
新学习了fhq treap,厉害了 先贴个神犇的版, from memphis /* Treap[Merge,Split] by Memphis */ #include<cstdio> # ...
- BZOJ 1691: [Usaco2007 Dec]挑剔的美食家 [treap 贪心]
1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 786 Solved: 391[Submit][S ...
- BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 [treap hash]
1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1318 Solved: 498[Submit][ ...
- 非旋treap模板
bzoj3580 非旋转treap 在大神教导下发现split一段区间时先split右边再split左边比较好写 #include <cstdio> #include <cstdli ...
- POJ2985 The k-th Largest Group[树状数组求第k大值+并查集||treap+并查集]
The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8807 Accepted ...
- [普通平衡树treap]【学习笔记】
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9046 Solved: 3840[Submit][Sta ...
- UVALive5031 Graph and Queries(Treap)
反向操作,先求出最终状态,再反向操作. 然后就是Treap 的合并,求第K大值. #include<cstdio> #include<iostream> #include< ...
- 【Treap】bzoj1588-HNOI2002营业额统计
一.题目 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司 ...
- hdu 4585 Shaolin treap
Shaolin Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Problem ...
随机推荐
- Linux下tomcat使用
http://tomcat.apache.org/download-70.cgi这里下载 放到Linux目录下,解压开, 默认port:8080能够直接使用 经常使用启动命令catalina.sh ...
- rpc远程过程协议调用
在linux 5.X以及下的版本你可以通过service portmap status命令查看rpc是否启动.如果提示running,表示正在运行:如果提示stop就是关闭了.如果没有安装,则通过安装 ...
- 2013ACM暑假集训总结-致将走上大三征途的我
回想起这个暑假,从开始与雄鹰一起的纠结要不要进集训队,与吉吉博博组队参加地大邀请赛,害怕进不了集训队.当时激励我月份开始接触的,记得当时在弄运动会来着,然后就问了雄鹰一些输入输出的东西,怀着满心的期待 ...
- Android的Touch系统简介(一
一.Android touch事件的相关概念 用户的Touch事件被包装成MotionEvent 用户当前的touch事件主要类型有: ACTION_DOWN: 表示用户开始触摸. ACTION_MO ...
- Creating a simple static file server with Rewrite--reference
Today, I’d like to take a quick moment to demonstrate how to make a simple file server using Rewrite ...
- 从 ReactiveCocoa 中能学到什么?不用此库也能学以致用
从知道ReactiveCocoa开始就发现对这个库有不同的声音,上次参加<T>技术沙龙时唐巧对在项目中已全面使用FRP的代码家提出为什么这种编程模型出现了这么长时间怎么像ReactiveC ...
- HDU 5211 筛法求约数
给出n个数a1,a2...an,定义函数 f[i]=j,(i<j),表示aj mod ai=0 的最小j,其中j大于i,如果不存在这样的数,则f[i]=0 求n个数所有f[]值的和 先用筛法o( ...
- 在/etc/password用户名前面加hello,ID前加is
方法2: #!/bin/sh #set -x file=/etc/passwd while read LINE #for i in `cat $file` do #username=`echo $i| ...
- 《scraping with python》
记得刚开始学习python时就觉得爬虫特别神奇,特别叼,但是网上的中文资料大都局限于爬取静态的页面,涉及到JavaScript的以及验证码的就很少了,[当时还并不习惯直接找外文资料]就这样止步于设计其 ...
- (转)C#文件操作
原文连接:http://www.cnblogs.com/wangshenhe/archive/2012/05/09/2490438.html 文件与文件夹操作主要用到以下几个类: 1.File类: 提 ...