Description

维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作:
1 k,将序列a从小到大排序,输出a_k的值。
2 k,将所有严格大于k的数a_i减去k。

Input

第一行包含两个正整数n,m(1<=n,m<=100000),分别表示序列的长度和操作的个数。
第二行包含n个正整数a_1,a_2,...,a_n(1<=a_i<=10^9),分别表示序列中的每个元素。
接下来m行,每行两个正整数op(1<=op<=2),k,若op=1,则1<=k<=n;若op=2,则1<=k<=10^9;依次描述每个操作。

Output

输出若干行,对于每个询问输出一行一个整数,即第k小的值。

Sample Input

4 5
1 5 6 12
2 5
1 1
1 2
1 3
1 4

Sample Output

1
1
5
7

Solution

把数排个序然后建$Splay$,每次修改对值域为$[1,k]$中的不管,$[k+1,k\times 2]$中的拆出来改完了再暴力插回去,对于$[k\times 2+1,MAX]$中打标记。我也不知道为什么复杂度是对的。

以后别有事没事把标记下传到$0$点,修改着修改着$0$下标的值就不知道被修改成什么鬼畜的数了。

Code

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #define N (100009)
  5. using namespace std;
  6.  
  7. int n,m,opt,k,a[N];
  8. int Root,Father[N],Son[N][];
  9. int Val[N],Size[N],Max[N],Add[N];
  10.  
  11. int Get(int x) {return Son[Father[x]][]==x;}
  12.  
  13. void Pushup(int x)
  14. {
  15. Size[x]=Size[Son[x][]]+Size[Son[x][]]+;
  16. Max[x]=max(Val[x],max(Max[Son[x][]],Max[Son[x][]]));
  17. }
  18.  
  19. int Build(int fa,int l,int r)
  20. {
  21. if (l>r) return ;
  22. int mid=(l+r)>>;
  23. Father[mid]=fa; Val[mid]=a[mid];
  24. Son[mid][]=Build(mid,l,mid-);
  25. Son[mid][]=Build(mid,mid+,r);
  26. Pushup(mid); return mid;
  27. }
  28.  
  29. void Rotate(int x)
  30. {
  31. int wh=Get(x);
  32. int fa=Father[x],fafa=Father[fa];
  33. if (fafa) Son[fafa][Son[fafa][]==fa]=x;
  34. Father[fa]=x; Son[fa][wh]=Son[x][wh^];
  35. if (Son[fa][wh]) Father[Son[fa][wh]]=fa;
  36. Father[x]=fafa; Son[x][wh^]=fa;
  37. Pushup(fa); Pushup(x);
  38. }
  39.  
  40. void Pushdown(int x)
  41. {
  42. if (Add[x]!=)
  43. {
  44. if (Son[x][])
  45. {
  46. Val[Son[x][]]+=Add[x];
  47. Add[Son[x][]]+=Add[x];
  48. Max[Son[x][]]+=Add[x];
  49. }
  50. if (Son[x][])
  51. {
  52. Val[Son[x][]]+=Add[x];
  53. Add[Son[x][]]+=Add[x];
  54. Max[Son[x][]]+=Add[x];
  55. }
  56. Add[x]=;
  57. }
  58. }
  59.  
  60. void Push(int x)
  61. {
  62. if (Father[x]) Push(Father[x]);
  63. Pushdown(x);
  64. }
  65.  
  66. void Splay(int x,int tar)
  67. {
  68. Push(x);
  69. for (int fa; (fa=Father[x])!=tar; Rotate(x))
  70. if (Father[fa]!=tar)
  71. Rotate(Get(fa)==Get(x)?fa:x);
  72. if (!tar) Root=x;
  73. }
  74.  
  75. int Findkth(int x)
  76. {
  77. int now=Root;
  78. while ()
  79. {
  80. Pushdown(now);
  81. if (Size[Son[now][]]>=x) now=Son[now][];
  82. else
  83. {
  84. x-=Size[Son[now][]];
  85. if (x==) {Splay(now,); return Val[now];}
  86. x--; now=Son[now][];
  87. }
  88. }
  89. }
  90.  
  91. int Find(int x)
  92. {
  93. int now=Root,ans=;
  94. while ()
  95. {
  96. Pushdown(now);
  97. if (Max[Son[now][]]>x) now=Son[now][];
  98. else
  99. {
  100. if (Val[now]>x) {Splay(now,); return now;}
  101. now=Son[now][];
  102. }
  103. }
  104. }
  105.  
  106. int Pre(int x)
  107. {
  108. Splay(x,);
  109. x=Son[x][];
  110. while (Son[x][]) x=Son[x][];
  111. return x;
  112. }
  113.  
  114. void Insert(int x)
  115. {
  116. int now=Root,fa=;
  117. while ()
  118. {
  119. Pushdown(now);
  120. if (!now)
  121. {
  122. Father[x]=fa;
  123. Son[fa][Val[fa]<Val[x]]=x;
  124. Max[x]=Val[x]; Size[x]=;
  125. Splay(x,); return;
  126. }
  127. fa=now, now=Son[now][Val[now]<Val[x]];
  128. }
  129. }
  130.  
  131. void DFS(int x,int k)
  132. {
  133. if (!x) return;
  134. Pushdown(x);
  135. DFS(Son[x][],k); DFS(Son[x][],k);
  136. Father[x]=Son[x][]=Son[x][]=Size[x]=Max[x]=;
  137. Val[x]-=k; Insert(x);
  138. }
  139.  
  140. void Update(int k)
  141. {
  142. int x=Pre(Find(k)),y=Find(*k);
  143. Splay(x,); Splay(y,x);
  144. int s=Son[y][]; Son[y][]=Father[Son[y][]]=;
  145. DFS(s,k);
  146. Splay(y,);
  147. x=Pre(Find(*k)),y=n+;
  148. Splay(x,); Splay(y,x);
  149. if (!Son[y][]) return;
  150. Add[Son[y][]]-=k; Val[Son[y][]]-=k; Max[Son[y][]]-=k;
  151. }
  152.  
  153. int main()
  154. {
  155. scanf("%d%d",&n,&m);
  156. for (int i=; i<=n+; ++i)
  157. scanf("%d",&a[i]);
  158. a[]=-2e9; a[n+]=2e9; Max[]=-2e9;
  159. sort(a+,a+n+);
  160. Root=Build(,,n+);
  161. for (int i=; i<=m; ++i)
  162. {
  163. scanf("%d%d",&opt,&k);
  164. if (opt==) printf("%d\n",Findkth(k+));
  165. else Update(k);
  166. }
  167. }

BZOJ4923:[Lydsy1706月赛]K小值查询(Splay)的更多相关文章

  1. BZOJ 4923: [Lydsy1706月赛]K小值查询 Splay + 思维

    Description 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. In ...

  2. BZOJ4923 [Lydsy1706月赛]K小值查询

    题意 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. \(n \leq 10 ...

  3. [BZ4923][Lydsy1706月赛]K小值查询

    K小值查询 题面 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. Input ...

  4. 4923: [Lydsy1706月赛]K小值查询 平衡树 非旋转Treap

    国际惯例的题面:这种维护排序序列,严格大于的进行操作的题都很套路......我们按照[0,k],(k,2k],(2k,inf)分类讨论一下就好.显然第一个区间的不会变化,第二个区间的会被平移进第一个区 ...

  5. [BZOJ 4923][Lydsy1706月赛]K小值查询

    传送门 势能分析平衡树,splay或treap都可以 放个指针版的就跑 #include <bits/stdc++.h> using namespace std; #define rep( ...

  6. BZOJ4923 K小值查询(splay)

    容易想到建一棵平衡树,修改时打上标记即可.但是修改会导致平衡树结构被破坏.注意到实际上只有[k+1,2k)这一部分数在平衡树中的位置会被改变,所以对这一部分暴力修改,因为每次都会使其至少减小一半,复杂 ...

  7. [bzoj4923]K小值查询

    来自FallDream的博客,未经允许,请勿转载,谢谢. 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有 ...

  8. 【BZOJ】3065: 带插入区间K小值

    http://www.lydsy.com/JudgeOnline/problem.php?id=3065 题意:带插入.修改的区间k小值在线查询.(原序列n<=35000, 询问<=175 ...

  9. 「BZOJ3065」带插入区间第K小值 替罪羊树×线段树

    题目描述 从前有\(n\)只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力\(a_i\).跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间\(k\)小值.他 ...

随机推荐

  1. WebFrom 【内置对象】— —跳转页面,页面传值

      Response    --  响应请求对象 传值  Response.Redirect("url");     --  地址?变量= 值  Response      -- ...

  2. Crossing River(1700poj)

    Crossing River Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9919   Accepted: 3752 De ...

  3. TCP连接与OKHTTP复用连接池

    Android网络编程(八)源码解析OkHttp后篇[复用连接池] 1.引子 在了解OkHttp的复用连接池之前,我们首先要了解几个概念. TCP三次握手 通常我们进行HTTP连接网络的时候我们会进行 ...

  4. 如何高效的使用-Notepad++

    Notepad++功能比 Windows 中的 Notepad(记事本)强大,除了可以用来制作一般的纯文字说明文件,也十分适合编写计算机程序代码.Notepad++ 不仅有语法高亮度显示,也有语法折叠 ...

  5. Hadoop HDFS 的 HttpFS

    参考 Hadoop权威指南 第3章中3.4节 背景 要写一个操作HDFS的web后台(文件CRUD),虽然可以直接使用HDFS提供的FileSystem类然后通过get方法获取到一个Distribut ...

  6. python学习之老男孩python全栈第九期_day009知识点总结

    '''# len# 计算字符串的长度# s = '金老板小护士'# len(s)# 不能用 len 怎么办#low一点的方法# count = 0# for i in s:# count += 1# ...

  7. apicloud 第一篇

    最近公司需要开发一款app,说实话,之前也只是对Android有过一部分的了解,ios基本上都毛都不知道,所以作为小公司的我们经过商议决定使用apicloud,虽然用户体验不如原生的好,但谁叫我们穷, ...

  8. linux上,mysql使用聚合函数group by 时报错:SELECT list is not in GROUP BY clause and contains nonaggre的问题

    之前在windows上测试是可以正常使用的,但是上传到Linux上后,就报错: Expression # of SELECT list is not in GROUP BY clause and co ...

  9. form图片上传遇到错误

    org.springframework.web.multipart.MultipartException: The current request is not a multipart request ...

  10. Node操作MongoDB并与express结合实现图书管理系统

    Node操作MongoDB数据库 原文链接:http://www.xingxin.me/ Web应用离不开数据库的操作,我们将陆续了解Node操作MongoDB与MySQL这是两个具有代表性的数据库, ...