#include <bits/stdc++.h>
using namespace std;
struct Node {
uint64_t mnm:18, lef:23, rig:23; } sgt[8000055];
pair<int, int> arr[200005]; int rot[200005], nrt;
int minSon(int nd, int le, int ri) {
if (!sgt[nd].lef or !sgt[nd].rig) {
return 0; }
else {
return min(sgt[sgt[nd].lef].mnm, sgt[sgt[nd].rig].mnm); } }
int update(int ls, int le, int ri, int st, int en) {
if (ri < st or en < le) {
return ls; }
int nw = ++nrt; sgt[nw] = sgt[ls];
if (st <= le and ri <= en) {
++sgt[nw].mnm; }
else {
int md = (le + ri) / 2,
aux = sgt[nw].mnm - minSon(nw, le, ri);
if (st <= md) {
sgt[nw].lef = update(sgt[nw].lef, le, md, st, en); }
if (md < en) {
sgt[nw].rig = update(sgt[nw].rig, md + 1, ri, st, en); }
sgt[nw].mnm = minSon(nw, le, ri) + aux; }
return nw; }
int query(int nd, int le, int ri, int st, int en) {
if (ri < st or en < le) {
return 1000000000; }
if (nd == 0) {
return 0; }
if (st <= le and ri <= en) {
return sgt[nd].mnm; }
else {
int md = (le + ri) / 2,
aux = sgt[nd].mnm - minSon(nd, le, ri);
return aux + min(query(sgt[nd].lef, le, md, st, en),
query(sgt[nd].rig, md + 1, ri, st, en)); } }
int main(void) {
// freopen("test.in", "r", stdin);
// freopen("test.out", "w", stdout);
int n, m; cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> arr[i].first; arr[i].second = i; }
sort(arr + 1, arr + n + 1);
for (int i = 1; i <= n; ++i) {
rot[i] = update(rot[i - 1], 1, n - m + 1,
max(1, arr[i].second - m + 1), min(n - m + 1, arr[i].second)); }
int q, ans = 0; cin >> q;
while (q--) {
int l, r, p; cin >> l >> r >> p; p ^= ans;
int pos = lower_bound(arr + 1, arr + n + 1, make_pair(p, 0)) - arr;
cout << (ans = query(rot[pos - 1], 1, n - m + 1, l, r)) << "\n"; }
return 0; }