#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 2e5 + 10;
const int B = 450;
int n, nq, m;
struct myPair {
int l, r, val;
inline myPair() : l(), r(), val() {}
inline myPair(int _l, int _r) : l(_l), r(_r), val((r - l + m - 1) % m + 1) {}
inline bool operator<(const myPair &b) const {
return val < b.val;
}
inline bool operator>(const myPair &b) const {
return val > b.val;
}
};
int blo[N], blen;
struct Qr {
int l, r, v, id;
inline bool operator<(const Qr &b) const {
if(blo[l] != blo[b.l]) return blo[l] < blo[b.l];
return r > b.r;
}
} q[N];
struct rollback_tp {
myPair mx, mx2;
int v;
};
int a[N], ans[N];
int num[N], nn;
void lisanhua() {
for(int i = 1; i <= n; i++) num[++nn] = a[i];
sort(num + 1, num + 1 + nn);
nn = unique(num + 1, num + 1 + nn) - (num + 1);
for(int i = 1; i <= n; i++) a[i] = lower_bound(num + 1, num + 1 + nn, a[i]) - num;
}
int cnt[N], pre[N], nxt[N];
int c_l, c_r; myPair c_mx, c_mx2;
rollback_tp sta[N]; int top;
void del(int p) {
int v = a[p];
cnt[v]--;
sta[++top] = {c_mx, c_mx2, v};
if(cnt[v] == 0) {
int p = pre[v], s = nxt[v];
myPair cur(num[p], num[s]);
if(c_mx.l == num[v] || c_mx.r == num[v]) swap(c_mx, c_mx2);
if(cur > c_mx) c_mx2 = c_mx, c_mx = cur;
else if(cur > c_mx2) c_mx2 = cur;
if(c_mx2.l == num[v] || c_mx2.r == num[v]) c_mx2 = (myPair){};
nxt[p] = s, pre[s] = p;
}
}
void roll_back() {
c_mx = sta[top].mx, c_mx2 = sta[top].mx2;
nxt[pre[sta[top].v]] = sta[top].v;
pre[nxt[sta[top].v]] = sta[top].v;
++cnt[sta[top].v];
--top;
}
void clear_buf() { top = 0; }
int get_ans(int v) {
if(c_mx.l == c_mx.r) {
return m - min((v - c_mx.l + m) % m, (c_mx.r - v + m) % m);
}
if(c_mx.l < v && v < c_mx.r || (c_mx.r < c_mx.l && (c_mx.l < v || v < c_mx.r)) || c_mx.l == c_mx.r) {
return max(c_mx2.val, max((v - c_mx.l + m) % m, (c_mx.r - v + m) % m));
}
return c_mx.val;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> nq >> m;
for(int i = 1; i <= n; i++) cin >> a[i];
if(m == 1) {
for(int i = 1; i <= nq; i++) {
int l, r, v; cin >> l >> r >> v;
cout << 0 << '\n';
}
return 0;
}
for(int i = 1; i <= nq; i++) cin >> q[i].l >> q[i].r >> q[i].v, q[i].id = i;
lisanhua();
blen = sqrt(n);
for(int i = 1; i <= n; i++) blo[i] = (i + blen - 1) / blen;
sort(q + 1, q + 1 + nq);
for(int i = 1; i <= n; i++) cnt[a[i]]++;
for(int i = 1; i < nn; i++) {
nxt[i] = i + 1, pre[i + 1] = i;
myPair cur(num[i], num[i + 1]);
if(cur > c_mx) c_mx2 = c_mx, c_mx = cur;
else if(cur > c_mx2) c_mx2 = cur;
}
{
nxt[nn] = 1, pre[1] = nn;
myPair cur(num[nn], num[1]);
if(cur > c_mx) c_mx2 = c_mx, c_mx = cur;
else if(cur > c_mx2) c_mx2 = cur;
}
c_l = 1, c_r = n;
for(int i = 1; i <= nq; i++) {
int l = q[i].l, r = q[i].r, v = q[i].v;
if(blo[l] != blo[q[i - 1].l]) {
while(top) roll_back(); c_r = n;
while(c_l < (blo[l] - 1) * blen + 1) del(c_l++);
clear_buf();
}
while(c_r > r) del(c_r--);
int tmp = top;
while(c_l < l) del(c_l++);
ans[q[i].id] = get_ans(v);
while(top > tmp) roll_back(), c_l--;
}
for(int i = 1; i <= nq; i++) cout << m - ans[i] << '\n';
return 0;
}