学会st表,就能写出这个题。
#include <bits/stdc++.h>
#define int long long
#define sz(a) ((int)a.size())
#define all(a) a.begin(), a.end()
using namespace std;
using PII = pair<int, int>;
using i128 = __int128;
const int N = 2e5 + 10;
int n, m;
int f[N][30];
int quary(int l, int r) {
int len = r - l + 1;
int k = 0;
while (1 << (k + 1) <= len) {
k ++;
}
return f[l][k] & f[r - (1 << k) + 1][k];
}
void solve() {
cin >> n;
for (int i = 1; i <= n; i ++) {
cin >> f[i][0];
}
for (int k = 1; k < 30; k ++) {
for (int i = 1; i <= n; i ++) {
if (i + (1 << (k - 1)) <= n) {
f[i][k] = f[i][k - 1] & f[i + (1 << (k - 1))][k - 1];
}
}
}
cout << " ";
int q; cin >> q;
while (q --) {
int l, k; cin >> l >> k;
int L = l, R = n;
while (L < R) {
int mid = (L + R + 1) / 2;
if (quary(l, mid) >= k) {
L = mid;
} else {
R = mid - 1;
}
}
if (quary(l, L) >= k) {
cout << L << " ";
} else {
cout << "-1 ";
}
}
cout << "\n";
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T = 1;
cin >> T; cin.get();
while (T --) solve();
return 0;
}