题意是说给出n个数。
然后给出一个查询(left,right, k) 给在left 和right 之间的数排序之后 输出第k大的数。
高级数据结构搞我完全不会啊。
连线段树怎么做这道题都没有思路。
只想到了一个排序然后找的办法,只要数据卡一下就过不了。。。
以后学了其他方法一定要回来搞。
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<bitset>
#include<vector>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-8
#define LL long long
#define PI 3.141592654
#define CLR(a,b) memset(a,b,sizeof(a))
#define FOR(i,a,b) for(int i=a;i<b;i++)
#define FOR_(i,a,b) for(int i=a;i>=b;i--)
#define sf scanf
#define pf printf
#define all(v) (v).begin(),(v).end()
#define acfun std::ios::sync_with_stdio(false)
#define SIZE (100000 +1)
#define MOD 1000000007
using namespace std;
struct node
{
int pos,val;
bool friend operator <(node a,node b)
{
return a.val<b.val;
}
}arr[SIZE];
int main()
{
int n,m;
while(~sf("%d%d",&n,&m))
{
FOR(i,0,n)
{
sf("%d",&arr[i].val);
arr[i].pos=i+1;
}
sort(arr,arr+n);
while(m--)
{
int l,r,k;
sf("%d%d%d",&l,&r,&k);
int tmp=0;
int pos=-1;
FOR(i,0,n)
{
if(l<=arr[i].pos&&r>=arr[i].pos)
tmp++;
if(tmp==k)
{
pos=i;
break;
}
}
pf("%d\n",arr[pos].val);
}
}
}