Description

You are working for Macrohard company in data structures department. After failing your previous task about key insertion you were asked to write a new data structure that would be able to return quickly k-th order statistics in the array segment. 
That is, given an array a[1...n] of different integer numbers, your program must answer a series of questions Q(i, j, k) in the form: "What would be the k-th number in a[i...j] segment, if this segment was sorted?" 
For example, consider the array a = (1, 5, 2, 6, 3, 7, 4). Let the question be Q(2, 5, 3). The segment a[2...5] is (5, 2, 6, 3). If we sort this segment, we get (2, 3, 5, 6), the third number is 5, and therefore the answer to the question is 5.

Input

The first line of the input file contains n --- the size of the array, and m --- the number of questions to answer (1 <= n <= 100 000, 1 <= m <= 5 000). 
The second line contains n different integer numbers not exceeding 109 by their absolute values --- the array for which the answers should be given. 
The following m lines contain question descriptions, each description consists of three numbers: i, j, and k (1 <= i <= j <= n, 1 <= k <= j - i + 1) and represents the question Q(i, j, k).

Output

For each question output the answer to it --- the k-th number in sorted a[i...j] segment.

Sample Input

7 3
1 5 2 6 3 7 4
2 5 3
4 4 1
1 7 3

Sample Output

5
6
3

Hint

This problem has huge input,so please use c-style input(scanf,printf),or you may got time limit exceed.

Source

Northeastern Europe 2004, Northern Subregion
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath> const int maxn=1e5+;
typedef long long ll;
using namespace std;
vector<int>vec;
struct node
{
int l,r;
int sum;
}tree[maxn*]; int a[maxn]; int getid(int x)
{
return lower_bound(vec.begin(),vec.end(),x)-vec.begin()+;
}
int cnt=,root[maxn];
void update(int l,int r,int pre,int &now,int p)
{
tree[++cnt]=tree[pre];
now=cnt;
tree[now].sum++;
if(l==r)
{
return ;
}
int mid=(l+r)>>;
if(mid>=p)
{
update(l,mid,tree[pre].l,tree[now].l,p);
}
else
{
update(mid+,r,tree[pre].r,tree[now].r,p);
}
} int query(int l,int r,int L,int R,int k)
{
if(l==r)
{
return l;
}
int mid=(l+r)>>;
int tmp=tree[tree[R].l].sum-tree[tree[L].l].sum;
if(tmp>=k)
{
return query(l,mid,tree[L].l,tree[R].l,k);
}
else
{
return query(mid+,r,tree[L].r,tree[R].r,k-tmp);
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int t=;t<=n;t++)
{
scanf("%d,",&a[t]);
vec.push_back(a[t]);
}
sort(vec.begin(),vec.end());
vec.erase(unique(vec.begin(),vec.end()),vec.end());
for(int t=;t<=n;t++)
{
update(,n,root[t-],root[t],getid(a[t]));
}
int l,r,k;
while(m--)
{
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",vec[query(,n,root[l-],root[r],k)-]);
} return ;
}

最新文章

  1. Visual Studio 2013执行项目报错:HTTP 错误 500.22
  2. React-Router学习整理
  3. 7z制作自解压安装包
  4. MongoDB 正则表达式
  5. Inno Setup设置NT服务
  6. 基于C#实现的HOOK键盘钩子实例代码
  7. HTML解析引擎:Jumony 开源项目
  8. 详解 Android 的 Activity 组件
  9. IOS开发网络篇之──ASIHTTPRequest详解
  10. Hadoop参数优化
  11. JavaScript不一样的语法
  12. SAP HANA 创建属性视图
  13. 第2章 rsync(二):inotify+rsync详细说明和sersync
  14. 用大白话扯扯那&quot;神奇&quot;的面向对象编程思维(一)
  15. git的学习笔记(二):git远程操作
  16. MFC消息 OnCtlColor 改变控件颜色
  17. python基础——1、python背景及特点——(YZ)
  18. CentOS下Redis的安装(转)
  19. 论文阅读笔记二十六:Fast R-CNN (ICCV2015)
  20. [ONTAK2015]Tasowanie

热门文章

  1. 【AHOI2009】中国象棋 题解(线性DP+数学)
  2. MyBatis深入理解参数
  3. 《Java核心技术(卷1)》笔记:第12章 并发
  4. 初识HTML(二)
  5. Django-model查询[为空、由某字符串开头、由某字符串结尾、包含某字符串],__isnull、__starswith、__endswith、__contains
  6. C#LeetCode刷题之#169-求众数(Majority Element)
  7. JavaScript 使用yrm修改镜像源
  8. 通过http、https域名访问静态网页、nginx配置负载均衡(nginx配置)
  9. 分布式数据库中间件 MyCat | 分库分表实践
  10. Go | Go 语言打包静态文件以及如何与Gin一起使用Go-bindata