关于空间,第零棵树是 \(4n\),其后每棵树都要多来 \(\log(n)\) 的空间,所以我是开 \(n(4+\log(n))\) 的空间。

关于借用节点:



图片来自这里

#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
int n, m, rot[200005], a[200005], b[200005], sum[4400005], lson[4400005];
int rson[4400005], uu, vv, ww, r, cnt;
int build(int l, int r){
int rt=++cnt;
int mid=(l+r)>>1;
sum[rt] = 0;
if(l<r){
lson[rt] = build(l, mid);
rson[rt] = build(mid+1, r);
}
return rt;
}
int update(int pre, int l, int r, int x){//pre就是rt准备“借”的那棵树
int rt=++cnt;
int mid=(l+r)>>1;
lson[rt] = lson[pre]; rson[rt] = rson[pre]; sum[rt] = sum[pre] + 1;
if(l<r){
if(x<=mid) lson[rt] = update(lson[pre], l, mid, x);
else rson[rt] = update(rson[pre], mid+1, r, x);
}
return rt;
}
int query(int uu, int vv, int l, int r, int k){
if(l>=r) return l;
int x=sum[lson[vv]]-sum[lson[uu]];
int mid=(l+r)>>1;
if(x>=k) return query(lson[uu], lson[vv], l, mid, k);
else return query(rson[uu], rson[vv], mid+1, r, k-x);
}
int main(){
cin>>n>>m;
for(int i=1; i<=n; i++){
scanf("%d", &a[i]);
b[i] = a[i];
}
sort(b+1, b+1+n);
r = unique(b+1, b+1+n) - (b + 1);
rot[0] = build(1, r);
for(int i=1; i<=n; i++){
int t=lower_bound(b+1, b+1+r, a[i])-b;//快速找出a[i]在整个不可重数组中的位置
rot[i] = update(rot[i-1], 1, r, t);
}
while(m--){
scanf("%d %d %d", &uu, &vv, &ww);
printf("%d\n", b[query(rot[uu-1], rot[vv], 1, r, ww)]);
}
return 0;
}

最新文章

  1. memcache 的内存管理介绍和 php实现memcache一致性哈希分布式算法
  2. WinRAR命令行
  3. nginx同一iP多域名配置方法
  4. C语言实现冒泡排序-整数排序
  5. Javascript中的Label语句
  6. C# List中写出LINQ类似SQL的语句
  7. GUI编程笔记(java)09:GUI控制文本框只能输入数字字符案例
  8. Ubuntu16.04下Intellij IDEA不能输入中文的问题
  9. SSH Session Recorder
  10. IT第二天 - JAVA环境的配置、Hello的编写
  11. MYSQL-用户权限的验证过程(转)
  12. 第4章3节《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览SYNC.TXT翻译参考(原创)
  13. [js高手之路] es6系列教程 - 对象功能扩展详解
  14. copy11
  15. KMP算法 Next数组详解
  16. 使用C# (.NET Core) 实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)
  17. Protostuff序列化分析
  18. IdentityServer4实战 - 谈谈 JWT 的安全策略
  19. Shell命令-文件及目录操作之touch、tree
  20. Linux中执行C++程序

热门文章

  1. 开机启动+Linux发送邮件
  2. ReferenceError: password is not defined
  3. 11.JAVA-Object类之finalize(),clone(),toString()等方法覆写
  4. OC 思维导向图
  5. hdu 3555 Bomb 炸弹(数位DP,入门)
  6. codevs 1497 取余运算
  7. Android(java)学习笔记147:自定义SmartImageView(继承自ImageView,扩展功能为自动获取网络路径图片)
  8. [Android 测试] 压力稳定性测试之: Monkey 详解分析脚本(转载)
  9. CPP-基础:C++中为什么需要一个头文件,一个cpp文件
  10. JavaScript中数据类型和typeof返回的数据类型