1. program bzoj3196;
  2. const inf=;
  3. maxn=;
  4. maxm=;
  5.  
  6. var n,m,time,temp:longint;
  7. root,a:array [..maxn] of longint;
  8. left,right,rnd,v,s,w:array [..maxm] of longint;
  9.  
  10. procedure update(now:longint);
  11. begin
  12. s[now]:=s[left[now]]+s[right[now]]+w[now];
  13. end;
  14.  
  15. procedure rightturn(var now:longint);
  16. var t:longint;
  17. begin
  18. t:=left[now];
  19. left[now]:=right[t];
  20. right[t]:=now;
  21. s[t]:=s[now];
  22. update(now);
  23. now:=t;
  24. end;
  25.  
  26. procedure leftturn(var now:longint);
  27. var t:longint;
  28. begin
  29. t:=right[now];
  30. right[now]:=left[t];
  31. left[t]:=now;
  32. s[t]:=s[now];
  33. update(now);
  34. now:=t;
  35. end;
  36.  
  37. procedure insert(var now:longint; num:longint);
  38. begin
  39. if now= then
  40. begin
  41. inc(time);
  42. now:=time;
  43. w[now]:=;
  44. s[now]:=w[now];
  45. v[now]:=num;
  46. rnd[now]:=random(inf);
  47. exit;
  48. end;
  49. inc(s[now]);
  50. if num=v[now] then inc(w[now])
  51. else if num<v[now] then
  52. begin
  53. insert(left[now],num);
  54. if rnd[left[now]]<rnd[now] then rightturn(now);
  55. end
  56. else
  57. begin
  58. insert(right[now],num);
  59. if rnd[right[now]]<rnd[now] then leftturn(now);
  60. end;
  61. end;
  62.  
  63. procedure del(var now:longint; num:longint);
  64. begin
  65. if v[now]=num then
  66. begin
  67. if w[now]> then
  68. begin
  69. dec(w[now]);
  70. dec(s[now]);
  71. exit;
  72. end;
  73. if left[now]*right[now]= then
  74. now:=left[now]+right[now]
  75. else
  76. if rnd[left[now]]<rnd[right[now]] then
  77. begin
  78. rightturn(now);
  79. del(now,num);
  80. end
  81. else
  82. begin
  83. leftturn(now);
  84. del(now,num);
  85. end
  86. end
  87. else
  88. if num<v[now] then
  89. begin
  90. del(left[now],num);
  91. dec(s[now]);
  92. end
  93. else
  94. begin
  95. del(right[now],num);
  96. dec(s[now]);
  97. end;
  98. end;
  99.  
  100. procedure build(now,l,r,x,num:longint);
  101. var mid:longint;
  102. begin
  103. insert(root[now],num);
  104. if l=r then exit;
  105. mid:=(l+r) shr ;
  106. if x<=mid then build(now<<,l,mid,x,num)
  107. else build(now<< or ,mid+,r,x,num);
  108. end;
  109.  
  110. procedure ask_rank(now,num:longint);
  111. begin
  112. if now= then exit;
  113. if num=v[now] then
  114. begin
  115. inc(temp,s[left[now]]);
  116. exit;
  117. end
  118. else
  119. if num<v[now] then
  120. ask_rank(left[now],num)
  121. else
  122. begin
  123. inc(temp,s[left[now]]+w[now]);
  124. ask_rank(right[now],num);
  125. end;
  126. end;
  127.  
  128. procedure get_rank(now,l,r,x,y,num:longint);
  129. var mid:longint;
  130. begin
  131. mid:=(l+r) shr ;
  132. if (l=x) and (r=y) then
  133. begin
  134. ask_rank(root[now],num);
  135. exit;
  136. end;
  137. if mid>=y then get_rank(now<<,l,mid,x,y,num)
  138. else if mid<x then get_rank(now<< or ,mid+,r,x,y,num)
  139. else
  140. begin
  141. get_rank(now<<,l,mid,x,mid,num);
  142. get_rank(now<< or ,mid+,r,mid+,y,num);
  143. end;
  144. end;
  145.  
  146. procedure get_index(x,y,z:longint);
  147. var l,r,ans,mid:longint;
  148. begin
  149. l:=; r:=inf;
  150. while l<=r do
  151. begin
  152. mid:=(l+r) shr ;
  153. temp:=;
  154. get_rank(,,n,x,y,mid);
  155. if temp<=z then
  156. begin
  157. l:=mid+;
  158. ans:=mid;
  159. end
  160. else
  161. r:=mid-;
  162. end;
  163. writeln(ans);
  164. end;
  165.  
  166. procedure change(now,l,r,x,num,y:longint);
  167. var mid:longint;
  168. begin
  169. del(root[now],y);
  170. insert(root[now],num);
  171. if l=r then exit;
  172. mid:=(l+r) shr ;
  173. if x<=mid then change(now<<,l,mid,x,num,y)
  174. else change(now<< or ,mid+,r,x,num,y);
  175. end;
  176.  
  177. function max(x,y:longint):longint;
  178. begin
  179. if x>y then exit(x)
  180. else exit(y);
  181. end;
  182.  
  183. function min(x,y:longint):longint;
  184. begin
  185. if x<y then exit(x)
  186. else exit(y);
  187. end;
  188.  
  189. procedure before(now,num:longint);
  190. begin
  191. if now= then exit;
  192. if v[now]<num then
  193. begin
  194. temp:=max(v[now],temp);
  195. before(right[now],num);
  196. end
  197. else
  198. before(left[now],num);
  199. end;
  200.  
  201. procedure after(now,num:longint);
  202. begin
  203. if now= then exit;
  204. if v[now]>num then
  205. begin
  206. temp:=min(v[now],temp);
  207. after(left[now],num);
  208. end
  209. else
  210. after(right[now],num);
  211. end;
  212.  
  213. procedure ask_after(now,l,r,x,y,num:longint);
  214. var mid:longint;
  215. begin
  216. if (l=x) and (r=y) then
  217. begin
  218. after(root[now],num);
  219. exit;
  220. end;
  221. mid:=(l+r) shr ;
  222. if mid>=y then ask_after(now<<,l,mid,x,y,num)
  223. else if mid<x then ask_after(now<< or ,mid+,r,x,y,num)
  224. else
  225. begin
  226. ask_after(now<<,l,mid,x,mid,num);
  227. ask_after(now<< or ,mid+,r,mid+,y,num);
  228. end;
  229. end;
  230.  
  231. procedure ask_before(now,l,r,x,y,num:longint);
  232. var mid:longint;
  233. begin
  234. if (l=x) and (r=y) then
  235. begin
  236. before(root[now],num);
  237. exit;
  238. end;
  239. mid:=(l+r) shr ;
  240. if mid>=y then ask_before(now<<,l,mid,x,y,num)
  241. else if mid<x then ask_before(now<< or ,mid+,r,x,y,num)
  242. else
  243. begin
  244. ask_before(now<<,l,mid,x,mid,num);
  245. ask_before(now<< or ,mid+,r,mid+,y,num);
  246. end;
  247. end;
  248.  
  249. procedure main;
  250. var i,x,y,now,f:longint;
  251. begin
  252. read(n,m);
  253. for i:= to n do read(a[i]);
  254. for i:= to n do build(,,n,i,a[i]);
  255. for i:= to m do
  256. begin
  257. read(f);
  258. case f of
  259. :
  260. begin
  261. read(x,y,now);
  262. temp:=;
  263. get_rank(,,n,x,y,now);
  264. writeln(temp);
  265. end;
  266. :
  267. begin
  268. read(x,y,now);
  269. get_index(x,y,now);
  270. end;
  271. :
  272. begin
  273. read(x,y);
  274. change(,,n,x,y,a[x]);
  275. a[x]:=y;
  276. end;
  277. :
  278. begin
  279. read(x,y,now);
  280. temp:=;
  281. ask_before(,,n,x,y,now);
  282. writeln(temp);
  283. end;
  284. :
  285. begin
  286. read(x,y,now);
  287. temp:=inf;
  288. ask_after(,,n,x,y,now);
  289. writeln(temp);
  290. end;
  291. end;
  292. end;
  293. end;
  294.  
  295. begin
  296. main;
  297. end.

BZOJ 3196的更多相关文章

  1. [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】

    题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...

  2. bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1807  Solved: 772[Submit][Stat ...

  3. BZOJ 3196 二逼平衡树

    Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的 ...

  4. BZOJ 3196: Tyvj 1730 二逼平衡树( 树套树 )

    这道题做法应该很多吧.... 我用了线段树套treap.... -------------------------------------------------------------------- ...

  5. bzoj 3196 && luogu 3380 JoyOI 1730 二逼平衡树 (线段树套Treap)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3196 题面; 3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Se ...

  6. BZOJ 3196 Tyvj 1730 二逼平衡树 树套树 线段树 treap

    http://www.lydsy.com/JudgeOnline/problem.php?id=3196 http://hzwer.com/2734.html 线段树套treap,似乎splay也可以 ...

  7. bzoj 3196/ Tyvj 1730 二逼平衡树 (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description ...

  8. 【42.38%】【BZOJ 3196】二逼平衡树

    Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1363 Solved: 579 [Submit][Status][Discuss] Descripti ...

  9. BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树

    [题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...

  10. bzoj 3196: Tyvj 1730 二逼平衡树

    #include<cstdio> #include<ctime> #include<cstdlib> #include<iostream> #defin ...

随机推荐

  1. URAL 1081 Binary Lexicographic Sequence

    第13个位置第5个Bit :13>num[4] =>1 第四个bit 13-num[4]=5 :5<num[3] =>0 ,3-1 第三个Bit 5>num[2](3) ...

  2. 空类的默认函数—— SAP电面(2)/FEI

    定义一个空类 class Empty { }; 默认会生成以下几个函数 2. 拷贝构造函数 Empty(const Empty& copy) { } 3. 赋值运算符 Empty& o ...

  3. BZOJ 4305: 数列的GCD( 数论 )

    对于d, 记{ai}中是d的倍数的数的个数为c, 那么有: 直接计算即可,复杂度O(NlogN+MlogM) --------------------------------------------- ...

  4. Linux 下 Hadoop java api 问题

    1. org.apache.hadoop.security.AccessControlException: Permission denied: user=opsuser, access=WRITE, ...

  5. highcharts图表组件入门教程:如何监听柱状图柱子点击事件动态更新当前数据点数值和所对应X轴刻度

    highcharts图表组件入门教程:如何监听柱状图柱子点击事件动态更新当前数据点数值和所对应X轴刻度 作者:highcharts | 时间:2014-6-11 14:07:05 | [小  大] | ...

  6. ThinkPHP常量参考

    常用常量 APP_NAME 当前项目名称 APP_PATH 当前项目路径 GROUP_NAME 当前分组名称 MODULE_NAME 当前Action模块名称 ACTION_NAME 当前操作的名称 ...

  7. Python开发环境Spyder安装方法

    Spyder(Scientific PYthon Development EnviRonment)是一个强大的交互式 Python 语言开发环境,提供高级的代码编辑.交互测试.调试等特性,支持包括 W ...

  8. [LeetCode]题解(python):099-Recover Binary Search Tree

    题目来源: https://leetcode.com/problems/recover-binary-search-tree/ 题意分析: 二叉搜索树中有两个点错了位置,恢复这棵树. 题目思路: 如果 ...

  9. Array.Add () and += in PowerShell

    $newArray = @() $newArray.Add("Hello") If I create a new array, and using the method Add() ...

  10. 为什么Lisp没有流行起来

    很久以前,这种语言站在计算机科学研究的前沿,特别是人工智能的研究方面.现在,它很少被用到,这一切并不是因为古老,类似古老的语言却被广泛应用.其他类似的古老的语言有??FORTRAN. COBOL. L ...