提交时间:2024-03-31 13:17:24

运行 ID: 27863

// 60pts #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 50009; int n, q, a[N]; namespace sub1 { int x, sum[N]; int slv(int l, int r) { if (l == r) return (a[l] >= x ? 1 : 1e9); int mid = (l + r) >> 1; sum[mid] = a[mid], sum[mid + 1] = a[mid + 1]; for (int i = mid - 1; i >= l; i--) sum[i] = sum[i + 1] | a[i]; for (int i = mid + 2; i <= r; i++) sum[i] = sum[i - 1] | a[i]; int rt = mid + 1, res = 1e9; for (int i = l; i <= mid && rt <= r; i++) { while (rt <= r && (sum[i] | sum[rt]) < x) rt++; if (rt <= r) res = min(res, rt - i + 1); } return min({res, slv(l, mid), slv(mid + 1, r)}); } void Main() { while (q--) { int op, i; scanf("%d", &op); if (op == 1) { scanf("%d%d", &i, &x); a[i] = x; } else { scanf("%d", &x); int ans = slv(1, n); printf("%d\n", ans >= 1e8 ? -1 : ans); } } } } namespace sub2 { int st[N][19]; int get(int l, int r) { int i = __lg(r - l + 1); return st[l][i] | st[r - (1 << i) + 1][i]; } map<int, int> mp; void Main() { for (int i = 1; i <= n; i++) st[i][0] = a[i]; for (int j = 1; (1 << j) <= n; j++) { for (int i = 1; i + (1 << j) - 1 <= n; i++) { st[i][j] = st[i][j - 1] | st[i + (1 << (j - 1))][j - 1]; } } for (int i = 1; i <= n; i++) { int l = i; while (l <= n) { int lt = l, rt = n, mid, x = get(i, l); if (mp.count(x)) mp[x] = min(mp[x], l - i + 1); else mp[x] = l - i + 1; while (lt < rt) { mid = (lt + rt + 1) >> 1; if (get(i, mid) == x) lt = mid; else rt = mid - 1; } l = rt + 1; } } auto it = mp.rbegin(), it1 = ++it; it--; while (it1 != mp.rend()) { it1->second = min(it1->second, it->second); it1++, it++; } while (q--) { int op, i, x; scanf("%d", &op); if (op == 1) scanf("%d%d", &i, &x), a[i] = x; else { scanf("%d", &x); auto it = mp.lower_bound(x); if (it == mp.end()) printf("-1\n"); else printf("%d\n", it->second); } } } } int main() { scanf("%d%d", &n, &q); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } sub1::Main(); return 0; }