//#pragma comment(linker, "/STACK:1024000000,1024000000") //#pragma GCC optimize(2) #include <bits/stdc++.h> using namespace std; typedef double dou; typedef long long ll; typedef pair<int, int> pii; typedef map<int, int> mii; #define pai acos(-1.0) #define M 4000005 #define inf 0x3f3f3f3f #define mod 1000000007 #define IN inline #define W(a) while(a) #define lowbit(a) a&(-a) #define left k<<1 #define right k<<1|1 #define lson L, mid, left #define rson mid + 1, R, right #define ms(a,b) memset(a,b,sizeof(a)) #define Abs(a) (a ^ (a >> 31)) - (a >> 31) #define random(a,b) (rand()%(b+1-a)+a) #define false_stdio ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) int n, m, cnt, Q; int T[M], Ls[M], Rs[M], sum[M]; int init[M], num[M]; int Built(int L, int R) { int rt = ++cnt; if (L < R) { int mid = (L + R) >> 1; Ls[rt] = Built(L, mid); Rs[rt] = Built(mid + 1, R); } return rt; } int updata(int L, int R, int pre, int id) { int rt = ++cnt; Ls[rt] = Ls[pre], Rs[rt] = Rs[pre], sum[rt] = sum[pre] + 1; if (L < R) { int mid = (L + R) >> 1; if (id <= mid)Ls[rt] = updata(L, mid, Ls[pre], id); else Rs[rt] = updata(mid + 1, R, Rs[pre], id); } return rt; } int query(int u, int v, int L, int R, int k) { if (L == R)return L; int x = sum[Ls[v]] - sum[Ls[u]]; int mid = (L + R) >> 1; if (x >= k)return query(Ls[u], Ls[v], L, mid, k); else return query(Rs[u], Rs[v], mid + 1, R, k - x); } int main() { false_stdio; cin >> n >> Q; for (int i = 1; i <= n; i++) { cin >> num[i]; init[i] = num[i]; } sort(init + 1, init + n + 1); m = unique(init + 1, init + n + 1) - init - 1; T[0] = Built(1, m); for (int i = 1; i <= n; i++) { int id = lower_bound(init + 1, init + m + 1, num[i]) - init; T[i] = updata(1, m, T[i - 1], id); } int l, r, k; for (int i = 1; i <= Q; i++) { cin >> l >> r >> k; cout << init[query(T[l - 1], T[r], 1, m, k)] << endl; } return 0; }