#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace atcoder; typedef long long ll; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define repr(i, n) for (int i = (int)(n)-1; i >= 0; i--) #define repk(i, k, n) for (int i = k; i < (int)(n); i++) #define all(v) v.begin(), v.end() #define mod1 1000000007 #define mod2 998244353 #define mod3 100000007 #define vi vector #define vs vector #define vc vector #define vl vector #define vb vector #define vvi vector> #define vvc vector> #define vvl vector> #define vvb vector> #define vvvi vector>> #define vvvl vector>> #define pii pair #define pil pair #define pli pair #define pll pair #define vpii vector> #define vpll vector> #define vvpii vector>> #define vvpll vector>> // using mint = modint998244353; template void debug(T e) { cerr << e << endl; } template void debug(vector &v) { rep(i, v.size()) { cerr << v[i] << " "; } cerr << endl; } template void debug(vector> &v) { rep(i, v.size()) { rep(j, v[i].size()) { cerr << v[i][j] << " "; } cerr << endl; } } template void debug(vector> &v) { rep(i, v.size()) { cerr << v[i].first << " " << v[i].second << endl; } } template void debug(set &st) { for (auto itr = st.begin(); itr != st.end(); itr++) { cerr << *itr << " "; } cerr << endl; } template void debug(multiset &ms) { for (auto itr = ms.begin(); itr != ms.end(); itr++) { cerr << *itr << " "; } cerr << endl; } template void debug(map &mp) { for (auto itr = mp.begin(); itr != mp.end(); itr++) { cerr << itr->first << " " << itr->second << endl; } } void debug_out() { cerr << endl; } template void debug_out(Head H, Tail... T) { cerr << H << " "; debug_out(T...); } int main() { ll N; cin >> N; vector X(N); for (ll i = 0; i < N; i++) { cin >> X[i]; } vector diff_sum(N, 0); for (ll i = 0; i < N - 1; i++) { if (X[i] == X[i + 1]) { diff_sum[i + 1] = diff_sum[i] + 1; } else { diff_sum[i + 1] = diff_sum[i]; } } vector kinds(N + 1, 0); ll Q; cin >> Q; for (ll i = 0; i < Q; i++) { ll l, r, S; cin >> l >> r >> S; l--; r--; // 幅によって値を確認する if (r - l >= 90) { // 答えが 1 かどうか if (diff_sum[r] - diff_sum[l] >= 60) { cout << 0 << endl; } else { if (S >= (1LL << (diff_sum[r] - diff_sum[l]))) { cout << 1 << endl; } else { cout << 0 << endl; } } } else { vector vec(r - l + 1); for (ll j = l; j <= r; j++) { vec[j - l] = X[j]; } debug(vec); ll len = r - l + 1; // debug(vec); // 答えで二分探索 ll ok = 0; ll ng = len + 2; while (ng - ok > 1) { ll mid = (ok + ng) / 2; vector prev_idx(len + 1, -1); ll now_kind = 0; ll left = 0; ll right = 0; while (true) { if (now_kind <= mid) { if (right == len) { prev_idx[right] = left; break; } else { prev_idx[right] = left; if (kinds[vec[right]] == 0) { now_kind++; } kinds[vec[right]]++; right++; } } else { kinds[vec[left]]--; if (kinds[vec[left]] == 0) { now_kind--; } left++; } } vector dp(len + 1, 0); vector dp_sum(len + 1, 0); dp[0] = 1; dp_sum[0] = 1; bool inf = false; for (ll j = 1; j <= len; j++) { ll sum_val = dp_sum[j - 1]; if (prev_idx[j] > 0) { sum_val = (sum_val - dp_sum[prev_idx[j] - 1]); } if (sum_val > S) { inf = true; break; } dp[j] = sum_val; dp_sum[j] = (dp[j] + dp_sum[j - 1]); } if (inf) { ng = mid; } else { ok = mid; } // debug(mid); // debug(dp); for (ll j = 0; j < len; j++) { kinds[vec[j]] = 0; } } // debug(ans); if (ok >= len) { cout << -1 << endl; } else { cout << ok << endl; } } } }