题目链接

思路

裸的主席树。查询的时候,通过相减求出区间内左子树中数的个数a。然后判断要查找的k是否比这个z要大。如果比这个值大,那么就去右子树中查找第k - z大,否则去左子树中查找第k大。

代码

/*
* @Author: wxyww
* @Date: 2018-12-11 16:27:19
* @Last Modified time: 2018-12-11 16:46:07
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<map>
#include<bitset>
using namespace std;
typedef long long ll;
const int N = 200000 + 100;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int a[N],root[N];
map<int,int>ma;
int tree[N * 30],ls[N * 30],rs[N * 30];
int tot,dy[N];
void update(int &rt,int lst,int l,int r,int pos) {
rt = ++tot;
ls[rt] = ls[lst];rs[rt] = rs[lst];
tree[rt] = tree[lst] + 1;
if(l == r) return;
int mid = (l + r) >> 1;
if(pos <= mid) update(ls[rt],ls[lst],l,mid,pos);
else update(rs[rt],rs[lst],mid + 1,r,pos);
}
int query(int L,int R,int l,int r,int k) {
int z = tree[ls[R]] - tree[ls[L]];
if(l == r) return l;
int mid = (l + r) >> 1;
if(k <= z) return query(ls[L],ls[R],l,mid,k);
else return query(rs[L],rs[R],mid + 1,r,k - z);
}
int main() {
int n = read(),m = read();
for(int i = 1;i <= n;++i) ls[i] = a[i] = read(); sort(ls + 1,ls + n + 1);
int js = 0;
ma[ls[1]] = ++js;
dy[js] = ls[1];
for(int i = 2;i <= n;++i) if(ls[i] != ls[i - 1]) ma[ls[i]] = ++js,dy[js] = ls[i];
for(int i = 1;i <= n;++i) a[i] = ma[a[i]]; for(int i = 1;i <= n;++i) update(root[i],root[i - 1],1,js,a[i]); while(m--) {
int l = read(),r = read(),k = read();
printf("%d\n",dy[query(root[l - 1],root[r],1,js,k)]);
}
return 0;
}

最新文章

  1. xml入门
  2. NYOJ题目101两点距离
  3. man/info
  4. 一个iOS图片选择器的DEMO(实现图片添加,宫格排列,图片长按删除,以及图片替换等功能)
  5. 例题:超市买东西的程序。输入商品信息,计算价格,价格满多少元打折。这道题用到结构体,集合,for循环,if else语句
  6. WPF之Binding对数据的转换(第五天)
  7. JAVA:23种设计模式详解(转)
  8. Java OAuth开发包资料
  9. Scientific Toolworks Understand for linux安装方法
  10. DotNetOpenAuth搭建OAuth2.0
  11. ucos任务控制块详解
  12. python计算文件夹大小(linux du命令 简化版)
  13. this final 关键字
  14. 消息队列中间件(二)使用 ActiveMQ
  15. 面试----你可以手写一个promise吗
  16. HTML5经典实例——1基础语法和语义
  17. Javascript转义字符串中的特殊字符处理
  18. java readProperties
  19. java模拟form上传数据
  20. Intelij U

热门文章

  1. dart正则
  2. git分支操作2
  3. python之路--递归, 二分法
  4. Partition算法以及其应用详解下(Golang实现)
  5. zabbix自定义模板——监控TCP连接状态
  6. java中集合Collection转list对象
  7. Delphi 在dbgrideh中表格输入数据时有效性的检查(转)
  8. python之类和__init__
  9. caffe网络中屏蔽某一层的输出Silence层
  10. linq之左连接 + group by