POJ 2104 - K-th Number

原创 2016年08月30日 17:46:17

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


题意:在给出 m 个数字和 n 个操作次数,每个操作次数给出3个数a,b,c,求出在区间 [a, b] 中第 c 大的数。

每个数字不但给他们数值,也给出序号,每次操作时从小到大遍历,遇到区间内的 c-1 ,直到 c 减到0即是答案。

#include <cstdio>
#include <algorithm>
using namespace std;

struct node
{
    int n, no;
};
node num[1000000 + 5];

int cmp(node a, node b)
{
    return a.n < b.n;
}

int main()
{
    int m, n;
    scanf("%d%d", &m, &n);
    for (int i = 0; i < m; ++i)
    {
        scanf("%d", &num[i].n);
        num[i].no = i;
    }
    sort(num, num+m, cmp);
    for (int i = 0; i < n; ++i)
    {
        int from, to, sym;
        scanf("%d%d%d", &from, &to, &sym);
        from--;
        to--;
        for (int j = 0; j < m; ++j)
        {
            if (num[j].no >= from && num[j].no <= to)
                sym--;
            if (sym == 0)
            {
                printf("%d\n", num[j].n);
                break;
            }
        }
    }
    return 0;
}


版权声明:Designed by Sureina 2016©Copyright.All Right Reserved

相关文章推荐

【POJ2104】K-th Number 主席树?函数式线段树?可持久化线段树?……反正是其中一个

可持久化线段树的模板题/理解题。
  • Vmurder
  • Vmurder
  • 2014年12月12日 08:40
  • 1441

POJ2104 —— K-th number

1、题目大意:区间第k小,什么修改没有。。。 2、分析:这个是可持久化线段树,也是主席树,解释一下,n个线段树是怎么存下的,就是每一颗线段树和前一个有logn个点不一样 然后我们只需要一个线段树开...

[POJ]2104 K-th Number 主席树&线段树合并

两个月前打了个主席树……今天又打了个线段树合并,发现线段树合并的代码挺短的……(其实也差不多) 主席树: #include #include #include #include #define m...

poj2104 K-th Number

离散化+主席树
  • sdfzyhx
  • sdfzyhx
  • 2016年10月04日 20:24
  • 106

POJ2104 K-th Number 题解&代码

你说什么?和HDU题目一样?不不不这才不是多组数据= = 其实重点在于我终于知道为什么我一直TLE了…map被卡了那个萌萌哒logn 所谓STL一时爽全家火葬场,改了数组记录之后过得轻轻松松 代...

poj 2104 K-th Number(划分树 or 主席树)

划分树模板题,敲上模板就ok了。 #include #include #include #include #include #include #include #include #include #i...

POJ-2104-K-th Number

POJ-2104-K-th Number http://poj.org/problem?id=2104 划分树的基本思想就是对于某个区间,把它划分成两个子区间,左边区间的数小于右边区间的数。查找的...
  • comeace
  • comeace
  • 2012年10月23日 21:13
  • 555

POJ2104 K-th Number(划分树和主席树代码)

K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 41198   Accepted: 13...

POJ 2104 K-th Number [主席树]

K-th Number Time Limit: 20000MS Memory Limit: 65536KB 64bit IO Format: %lld & %lluDescrip...

主席树 poj 2104 K-th Number

主席树又名可持久化线段树。 我们先撇开可持久化看看主席树是怎么实现的。维护一个长度为n的序列,我们可以建一颗线段树来维护,最上的根节点代表的区间是[1,n]。 我们知道线段树的形态由你给的[l,r],...
  • Mtrix
  • Mtrix
  • 2016年08月26日 17:55
  • 234
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 2104 - K-th Number
举报原因:
原因补充:

(最多只允许输入30个字)