Kth number
Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 21499 Accepted Submission(s): 6560
Problem Description
Give you a sequence and ask you the
k
t
h
k_{th}
kth big number of a inteval.
Input
The first line is the number of the test cases.
For each test case, the first line contain two integer n and m (n, m <= 100000), indicates the number of integers in the sequence and the number of the quaere.
The second line contains n integers, describe the sequence.
Each of following m lines contains three integers s, t, k.
[s, t] indicates the interval and k indicates the kth big number in interval [s, t]
Output
For each test case, output m lines. Each line contains the kth big number.
Sample Input
1
10 1
1 4 2 3 5 6 7 8 9 0
1 3 2
Sample Output
2
#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 1e5+7;
int n, m, cnt, root[MAXN], a[MAXN], x, y, k;
struct node{int l, r, sum;} T[MAXN*40];
vector<int> v;
int getid(int x) { return lower_bound(v.begin(), v.end(), x)-v.begin() + 1;}
void update(int l, int r, int &x, int y, int pos) {// T[y] 是上一版本的, T[x] 是这一版本的
T[++cnt] = T[y]; T[cnt].sum++; x = cnt;
if(l == r) return ;
int mid = (l+r)>>1;
if(mid >= pos) update(l, mid, T[x].l, T[y].l, pos);
else update(mid+1, r, T[x].r, T[y].r, pos);
}
int query(int l, int r, int x, int y, int k) {
if(l == r) return l;
int mid = (l+r)>>1;
int sum = T[T[y].l].sum - T[T[x].l].sum;
if(sum>=k) return query(l, mid, T[x].l, T[y].l, k);
else return query(mid+1, r, T[x].r, T[y].r, k - sum);
}
int main() {
int t;scanf("%d",&t);
while(t--) {
v.clear();
cnt = 0;
scanf("%d %d",&n, &m);
for(int i=1;i<=n;++i) scanf("%d",&a[i]), v.push_back(a[i]);
sort(v.begin(),v.end());
v.erase(unique(v.begin(), v.end()), v.end());
for(int i=1;i<=n;++i) update(1,n,root[i],root[i-1],getid(a[i]));
for(int i=1;i<=m;++i) {
scanf("%d %d %d",&x,&y,&k);
printf("%d\n",v[query(1, n, root[x-1], root[y], k) - 1]);
}
}
return 0;
}
248



被折叠的 条评论
为什么被折叠?



