POJ 1442 Treap模板
2016-07-09 22:30
169 查看
// by SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int cnt=0,jy,a[30500],n,m,root=-1; struct node{ int left,right,count_left,count_right,key,priority; }treap[30500]; void zig(int &x){ int y=treap[x].right; treap[x].right=treap[y].left; treap[x].count_right=treap[y].count_left; treap[y].left=x; treap[y].count_left=treap[x].count_left+treap[x].count_right+1; x=y; } void zag(int &x){ int y=treap[x].left; treap[x].left=treap[y].right; treap[x].count_left=treap[y].count_right; treap[y].right=x; treap[y].count_right=treap[x].count_left+treap[x].count_right+1; x=y; } void insert(int &x,int new_key){ if(x==-1){ x=cnt++; treap[x].left=treap[x].right=-1; treap[x].priority=rand(); treap[x].key=new_key; treap[x].count_left=treap[x].count_right=0; } else if(new_key<treap[x].key){ treap[x].count_left++; insert(treap[x].left,new_key); if(treap[x].priority>treap[treap[x].left].priority)zag(x); } else{ treap[x].count_right++; insert(treap[x].right,new_key); if(treap[x].priority>treap[treap[x].right].priority)zig(x); } } int query(int &x,int k_th){ if(treap[x].count_left+1==k_th)return treap[x].key; if(treap[x].count_left+1<k_th)return query(treap[x].right,k_th-treap[x].count_left-1); return query(treap[x].left,k_th); } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=m;i++){ scanf("%d",&jy); while(cnt<jy)insert(root,a[cnt+1]); printf("%d\n",query(root,i)); } }
相关文章推荐
- GridView中BoundField类型列的改行方法
- 【Linux】阻塞信号
- Java 相关
- SSH(三)
- Masonry介绍与使用实践(快速上手Autolayout)
- leetcode.373. Find K Pairs with Smallest Sums
- MapReduce原理
- viewpager引导页
- sqlite3学习笔记——sqlite3中日期时间的自动增量
- 配置Struts2(以登录为例)
- 290. Word Pattern
- 技术布道者宣言
- zabbix_server
- nyoj35 表达式求值
- windows 下配置 Nginx 常见问题
- Bzoj2440 完全平方数
- hdu 5062(水题)
- 289. Game of Life
- 数据结构实验之链表七:单链表中重复元素的删除
- 51nod 1138 连续整数的和(数学公式)