// geminiによりPythonからC++に翻訳 #include #include #include #include using namespace std; // 階層型ビットセットの最大範囲 (2^24 = 16,777,216) const int MAX_VAL = 1 << 24; const int D_SIZE = 20000005; struct HierarchicalBitset { vector layers[4]; HierarchicalBitset() { layers[0].resize(1); layers[1].resize(64); layers[2].resize(4096); layers[3].resize(262144); } void add(int a) { for (int i = 3; i >= 0; --i) { int a0 = a & 63; a >>= 6; layers[i][a] |= (1ULL << a0); } } void dec(int a) { for (int i = 3; i >= 0; --i) { int a0 = a & 63; a >>= 6; layers[i][a] ^= (1ULL << a0); if (layers[i][a]) break; // 上位層がまだ0でなければ停止 } } // Predecessor: a以下の最大値 (Pythonのbslに相当) int bsl(int a) { if (a < 0) return -1; // aを含まない「未満」を探す場合は a -= 1 するが、元のコードは a+1 してから探索 // ここでは inclusive (a以下) として実装 for (int i = 3; i >= 0; --i) { uint64_t mask = (1ULL << (a & 63)) | ((1ULL << (a & 63)) - 1); uint64_t x = layers[i][a >> 6] & mask; if (x) { int rep = ((a >> 6) << 6) | (63 - __builtin_clzll(x)); for (int j = i + 1; j < 4; ++j) { rep = (rep << 6) | (63 - __builtin_clzll(layers[j][rep])); } return rep; } a = (a >> 6) - 1; if (a < 0) break; } return -1; } // Successor: a以上の最小値 (Pythonのbsrに相当) int bsr(int a) { if (a >= MAX_VAL) return -1; for (int i = 3; i >= 0; --i) { uint64_t mask = ~((1ULL << (a & 63)) - 1); uint64_t x = layers[i][a >> 6] & mask; if (x) { int rep = ((a >> 6) << 6) | __builtin_ctzll(x); for (int j = i + 1; j < 4; ++j) { rep = (rep << 6) | __builtin_ctzll(layers[j][rep]); } return rep; } a = (a >> 6) + 1; if (a >= (1 << (6 * i))) break; } return -1; } }; int D[D_SIZE]; int cnt0 = 0; HierarchicalBitset X, Y; void f0(int a) { D[a]++; if (D[a] > 1) { cnt0++; return; } int al = X.bsl(a - 1); int ar = X.bsr(a + 1); X.add(a); if (al != -1 && ar != -1) { int diff = ar - al; if (--D[10000000 + diff] == 0) Y.dec(diff); } if (al != -1) { int diff = a - al; if (++D[10000000 + diff] == 1) Y.add(diff); } if (ar != -1) { int diff = ar - a; if (++D[10000000 + diff] == 1) Y.add(diff); } } void f1(int a) { D[a]--; if (D[a] > 0) { cnt0--; return; } X.dec(a); int al = X.bsl(a - 1); int ar = X.bsr(a + 1); if (al != -1 && ar != -1) { int diff = ar - al; if (++D[10000000 + diff] == 1) Y.add(diff); } if (al != -1) { int diff = a - al; if (--D[10000000 + diff] == 0) Y.dec(diff); } if (ar != -1) { int diff = ar - a; if (--D[10000000 + diff] == 0) Y.dec(diff); } } struct Query { int t, l, r, x, id; }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, q; cin >> n >> q; vector A(n); for (int i = 0; i < n; ++i) cin >> A[i]; int block_size = max(1, (int)(n / sqrt(q + 1))); vector queries(q); for (int i = 0; i < q; ++i) { string c; cin >> queries[i].l >> queries[i].r >> queries[i].x >> c; queries[i].l--; queries[i].t = (c == "L" ? 0 : 1); queries[i].id = i; } sort(queries.begin(), queries.end(), [&](const Query& a, const Query& b) { int ablock = a.l / block_size; int bblock = b.l / block_size; if (ablock != bblock) return ablock < bblock; return (ablock % 2 == 0) ? (a.r < b.r) : (a.r > b.r); }); vector ans(q); int nl = 0, nr = 0; for (auto& qry : queries) { while (qry.l < nl) f0(A[--nl]); while (nr < qry.r) f0(A[nr++]); while (nl < qry.l) f1(A[nl++]); while (qry.r < nr) f1(A[--nr]); int res; if (qry.t == 0) { res = Y.bsl(qry.x); if (cnt0 > 0) res = max(res, 0); } else { res = Y.bsr(qry.x); } ans[qry.id] = res; } for (int x : ans) cout << x << "\n"; return 0; }