#include<bits/stdc++.h> #define FIO cin.tie(0); ios::sync_with_stdio(false) #define all(x) (x).begin(), (x).end() #define fi first #define se second #define TEST #define TESTS int t = 1; cin >> t; while (t--)
voidmodify(int u, int l, int r, int ql, int qr, int x, int y){ if (ql <= l && qr >= r) { e[u].push_back({x, y}); return; } int mid = l + r >> 1; if (mid >= ql) modify(lc, l, mid, ql, qr, x, y); if (mid < qr) modify(rc, mid + 1, r, ql, qr, x, y); }
voidkasta(int u, int l, int r){ int cnt = 0; for (auto [x, y] : e[u]) { x = find(x), y = find(y); if (x == y) continue; merge(x, y); cnt++; } if (l == r) { if (op[l] == 2) ans[l] = find(x[l]) == find(y[l]); } else { int mid = l + r >> 1; kasta(lc, l, mid); kasta(rc, mid + 1, r); } while (cnt--) { undo(); } }
voidsolve(){ int n, m; cin >> n >> m; for (int i = 1; i <= m; ++i) { cin >> op[i] >> x[i] >> y[i]; if (x[i] > y[i]) swap(x[i], y[i]); if (op[i] == 0) mp[x[i]][y[i]] = i; elseif (op[i] == 1) { modify(1, 1, m, mp[x[i]][y[i]], i - 1, x[i], y[i]); mp[x[i]][y[i]] = 0; } } for (int x = 1; x <= n; ++x) { for (int y = x + 1; y <= n; ++y) { if (mp[x][y]) modify(1, 1, m, mp[x][y], m, x, y); } } for (int i = 1; i <= n; ++i) fa[i] = i, sz[i] = 1; kasta(1, 1, m); for (int i = 1; i <= m; ++i) { if (op[i] == 2) { cout << (ans[i] ? "Y\n" : "N\n"); } } }
#include<bits/stdc++.h> #define FIO cin.tie(0); ios::sync_with_stdio(false) #define all(x) (x).begin(), (x).end() #define fi first #define se second #define TEST #define TESTS int t = 1; cin >> t; while (t--)
voidmodify(int u, int l, int r, int ql, int qr, int x, int y){ if (ql <= l && qr >= r) { e[u].emplace_back(x, y); return; } int mid = l + r >> 1; if (ql <= mid) modify(lc, l, mid, ql, qr, x, y); if (qr > mid) modify(rc, mid + 1, r, ql, qr, x, y); }
voiddfs(int u, int l, int r){ int cnt = 0; for (auto [x, y] : e[u]) { x = find(x), y = find(y); if (x == y) continue; merge(x, y); cnt++; part--; } if (l == r) { if (part == 1) ans = l; } else { int mid = l + r >> 1; dfs(lc, l, mid); if (ans == -1) dfs(rc, mid + 1, r); } while (cnt--) { undo(); part++; } }
voidsolve(){ int n, m; cin >> n >> m; part = n; for (int i = 1; i <= n; ++i) fa[i] = i, sz[i] = 1; for (int i = 0, u, v, w; i < m; ++i) { cin >> u >> v >> w; if (w) modify(1, 0, W, 0, w - 1, u, v); modify(1, 0, W, w + 1, W, u, v); } dfs(1, 0, W); cout << ans << "\n"; }
#include<bits/stdc++.h> #define FIO cin.tie(0); ios::sync_with_stdio(false) #define all(x) (x).begin(), (x).end() #define fi first #define se second #define TEST #define TESTS int t = 1; cin >> t; while (t--)
voidmodify(int u, int l, int r, int ql, int qr, int i){ if (ql <= l && qr >= r) { E[u].push_back(i); return; } int mid = l + r >> 1; if (ql <= mid) modify(lc, l, mid, ql, qr, i); if (qr > mid) modify(rc, mid + 1, r, ql, qr, i); }
voiddfs(int u, int l, int r){ int cnt = 0; for (auto i : E[u]) { int _e = e[i]; int _c = c[i]; int _x = x[_e], _y = y[_e]; int x1 = _x + n, y1 = _y + n; _x = find(_c, _x), _y = find(_c, _y), x1 = find(_c, x1), y1 = find(_c, y1); if (_x != y1) { merge(_c, _x, y1); cnt++; } if (_y != x1) { merge(_c, _y, x1); cnt++; } } if (l == r) { if (find(c[l], x[e[l]]) == find(c[l], y[e[l]])) { c[l] = lastColor[e[l]]; } else { ans[l] = 1; lastColor[e[l]] = c[l]; } } else { int mid = l + r >> 1; dfs(lc, l, mid); dfs(rc, mid + 1, r); } while (cnt--) { undo(); } }
voidsolve(){ cin >> n >> m >> k >> q; for (int i = 1; i <= m; ++i) { cin >> x[i] >> y[i]; } for (int i = 1; i <= q; ++i) { cin >> e[i] >> c[i]; } for (int c = 1; c <= k; ++c) { for (int i = 1; i <= 2 * n; ++i) { fa[c][i] = i; sz[c][i] = 1; } } for (int i = 1; i <= q; ++i) { post[e[i]] = q; } for (int i = q; i >= 1; --i) { if (i + 1 > post[e[i]]) continue; modify(1, 1, q, i + 1, post[e[i]], i); post[e[i]] = i; } dfs(1, 1, q); for (int i = 1; i <= q; ++i) cout << (ans[i] ? "YES" : "NO") << "\n"; }
#include<bits/stdc++.h> #define FIO cin.tie(0); ios::sync_with_stdio(false) #define all(x) (x).begin(), (x).end() #define fi first #define se second #define TEST #define TESTS int t = 1; cin >> t; while (t--)
usingnamespace std; using i64 = longlong; using u32 = unsigned; using u64 = unsignedlonglong; using pii = std::pair<int, int>;
template<typename T> voidchkmin(T& a, T b){ a = min(a, b); } template<typename T> voidchkmax(T& a, T b){ a = max(a, b); }
constexprint N = 1e3 + 10; constexprint Q = 3e4 + 10; constexprint LOG = 20; constexprint BAS = 1e7 + 19; constexprint MOD = 1e9 + 7;
#define lc u<<1 #define rc u<<1|1 i64 dp[N], bak[LOG][N]; vector<int> e[Q << 2]; int v[Q << 1], w[Q << 1]; int st[Q << 1], ed[Q << 1], op[Q]; i64 ans[Q]; int n, k, q;
voidmodify(int u, int l, int r, int ql, int qr, int i){ if (ql <= l && qr >= r) { e[u].push_back(i); return; } int mid = l + r >> 1; if (ql <= mid) modify(lc, l, mid, ql, qr, i); if (qr > mid) modify(rc, mid + 1, r, ql, qr, i); }
voiddfs(int u, int l, int r){ int d = __lg(u); for (int i = 0; i <= k; ++i) bak[d][i] = dp[i]; for (int i : e[u]) { for (int j = k; j >= w[i]; --j) { chkmax(dp[j], dp[j - w[i]] + v[i]); } } if (l == r) { if (op[l] == 3) { i64 res = 0; i64 x = 1; for (int i = 1; i <= k; ++i) { res = (res + dp[i] * x) % MOD; x = (x * BAS) % MOD; } ans[l] = res; } } else { int mid = l + r >> 1; dfs(lc, l, mid); dfs(rc, mid + 1, r); } for (int i = 0; i <= k; ++i) dp[i] = bak[d][i]; }
voidsolve(){ cin >> n >> k; for (int i = 1; i <= n; ++i) { cin >> v[i] >> w[i]; } cin >> q; for (int i = 1; i <= n; ++i) { st[i] = 1; ed[i] = q; } for (int i = 1; i <= q; ++i) { int x, y; cin >> op[i]; if (op[i] == 1) { cin >> x >> y; ++n; v[n] = x, w[n] = y; st[n] = i; ed[n] = q; } elseif (op[i] == 2) { cin >> x; ed[x] = i - 1; } } for (int i = 1; i <= n; ++i) { if (st[i] > ed[i]) continue; modify(1, 1, q, st[i], ed[i], i); } dfs(1, 1, q); for (int i = 1; i <= q; ++i) if (op[i] == 3) cout << ans[i] << "\n"; }
#include<bits/stdc++.h> #define FIO cin.tie(0); ios::sync_with_stdio(false) #define all(x) (x).begin(), (x).end() #define fi first #define se second #define TEST #define TESTS int t = 1; cin >> t; while (t--)
usingnamespace std; using i64 = longlong; using u32 = unsigned; using u64 = unsignedlonglong; using pii = std::pair<int, int>;
constexprint N = 1e4 + 10; constexprint MOD = 998244353;
#define lc u<<1 #define rc u<<1|1 bitset<10001> dp, ans, tmp[20]; vector<int> e[N << 2]; int n, q;
voidmodify(int u, int l, int r, int ql, int qr, int x){ if (ql <= l && qr >= r) { e[u].push_back(x); return; } int mid = l + r >> 1; if (ql <= mid) modify(lc, l, mid, ql, qr, x); if (qr > mid) modify(rc, mid + 1, r, ql, qr, x); }
voiddfs(int u, int l, int r){ tmp[__lg(u)] = dp; for (int x : e[u]) { dp |= (dp << x); } if (l == r) { ans |= dp; } else { int mid = l + r >> 1; dfs(lc, l, mid); dfs(rc, mid + 1, r); } dp = tmp[__lg(u)]; }
voidsolve(){ cin >> n >> q; for (int i = 1; i <= q; ++i) { int l, r, x; cin >> l >> r >> x; modify(1, 1, n, l, r, x); } dp[0] = 1; dfs(1, 1, n); int cnt = 0; for (int i = ans._Find_next(0); i != ans.size() && i <= n; i = ans._Find_next(i)) { cnt++; } cout << cnt << "\n"; for (int i = ans._Find_next(0); i != ans.size() && i <= n; i = ans._Find_next(i)) { cout << i << " "; } cout << "\n"; }
#include<bits/stdc++.h> #define FIO cin.tie(0); ios::sync_with_stdio(false) #define all(x) (x).begin(), (x).end() #define fi first #define se second #define TEST #define TESTS int t = 1; cin >> t; while (t--)
usingnamespace std; using i64 = longlong; using u32 = unsigned; using u64 = unsignedlonglong; using pii = std::pair<int, int>;
template<typename T> voidchkmin(T& a, T b){ a = min(a, b); } template<typename T> voidchkmax(T& a, T b){ a = max(a, b); }
constexprint N = 2e5 + 10; constexprint BIT = 30; constexprint MOD = 998244353;
#define lc u<<1 #define rc u<<1|1 vector<tuple<int, int, int>> e[N << 2]; int op[N], x[N], y[N], w[N], ans[N]; array<int, 4> a[N << 1]; int fa[N], sz[N], eor[N], top; tuple<int, int> stk[N << 1]; int basis[BIT], pos[BIT], basiz; int n, m, q;
voidinsert(int x){ for (int i = BIT - 1; i >= 0; --i) { if (x >> i & 1) { if (basis[i] == 0) { basis[i] = x; pos[++basiz] = i; return; } x ^= basis[i]; } } }
intminXor(int x){ for (int i = BIT - 1; i >= 0; --i) chkmin(x, x ^ basis[i]); return x; }
voidmodify(int u, int l, int r, int ql, int qr, int x, int y, int w){ if (ql <= l && qr >= r) { e[u].emplace_back(x, y, w); return; } int mid = l + r >> 1; if (ql <= mid) modify(lc, l, mid, ql, qr, x, y, w); if (qr > mid) modify(rc, mid + 1, r, ql, qr, x, y, w); }
voiddfs(int u, int l, int r){ int oldsiz = basiz; int cnt = 0; for (auto [x, y, w] : e[u]) { if (merge(x, y, w)) { cnt++; } } if (l == r) { if (op[l] == 3) { ans[l] = minXor(getXor(x[l]) ^ getXor(y[l])); } } else { int mid = l + r >> 1; dfs(lc, l, mid); dfs(rc, mid + 1, r); } cancel(oldsiz); while (cnt--) { undo(); } }
voidsolve(){ cin >> n >> m; for (int i = 1; i <= m; ++i) { auto& [x, y, t, w] = a[i]; cin >> x >> y >> w; t = 0; } cin >> q; for (int i = 1; i <= q; ++i) { cin >> op[i] >> x[i] >> y[i]; if (op[i] == 1) cin >> w[i]; if (op[i] != 3) { auto& [x1, y1, t, w1] = a[++m]; x1 = x[i]; y1 = y[i]; t = i; w1 = w[i]; } } for (int i = 1; i <= n; ++i) fa[i] = i, sz[i] = 1; sort(a + 1, a + m + 1, [&](auto x, auto y) { if (x[0] != y[0]) return x[0] < y[0]; if (x[1] != y[1]) return x[1] < y[1]; return x[2] < y[2]; }); for (int l = 1, r = 1; l <= m; l = ++r) { int u = a[l][0], v = a[l][1]; while (r + 1 <= m && a[r + 1][0] == u && a[r + 1][1] == v) r++; for (int i = l; i <= r; i += 2) { int d = a[i][3]; int st = a[i][2], ed = (i + 1 <= r ? a[i + 1][2] - 1 : q); modify(1, 0, q, st, ed, u, v, d); } } dfs(1, 0, q); for (int i = 1; i <= q; ++i) { if (op[i] == 3) cout << ans[i] << "\n"; } }
#include<bits/stdc++.h> #define FIO cin.tie(0); ios::sync_with_stdio(false) #define all(x) (x).begin(), (x).end() #define fi first #define se second #define TEST #define TESTS int t = 1; cin >> t; while (t--)
usingnamespace std; using i64 = longlong; using u32 = unsigned; using u64 = unsignedlonglong; using pii = std::pair<int, int>; using bs = bitset<1000>;
constexprint N = 1e3 + 10; constexprint BIT = 1000; constexprint MOD = 998244353;
#define lc u<<1 #define rc u<<1|1 int op[N], x[N], y[N]; vector<tuple<int, int, bs>> e[N << 2]; bs ans[N], w[N], basis[BIT], eor[N]; int basiz, pos[BIT]; int fa[N]; int last[N]; int n, m, q;
voidinsert(bs& w){ for (int i = BIT - 1; i >= 0; --i) { if (w[i]) { if (basis[i][i] == 0) { basis[i] = w; pos[++basiz] = i; return; } w ^= basis[i]; } } }
voidcancel(int oldsiz){ while (basiz > oldsiz) { basis[pos[basiz--]].reset(); } }
bs getMax(){ bs res; for (int i = BIT - 1; i >= 0; --i) { if (res[i] == 0 && basis[i][i] == 1) { res ^= basis[i]; } } return res; }
intfind(int x){ if (x != fa[x]) { int t = fa[x]; fa[x] = find(t); eor[x] ^= eor[t]; } return fa[x]; }
bs getXor(int x){ find(x); return eor[x]; }
voidmerge(int x, int y, bs& w){ bs ww = w ^ getXor(x) ^ getXor(y); x = find(x), y = find(y); if (x == y) { insert(ww); } else { fa[y] = x; eor[y] = ww; } }
voidmodify(int u, int l, int r, int ql, int qr, int x, int y, bs& w){ if (ql <= l && qr >= r) { e[u].emplace_back(x, y, w); return; } int mid = l + r >> 1; if (ql <= mid) modify(lc, l, mid, ql, qr, x, y, w); if (qr > mid) modify(rc, mid + 1, r, ql, qr, x, y, w); }
voiddfs(int u, int l, int r){ int oldsiz = basiz; for (auto [x, y, w] : e[u]) { merge(x, y, w); } if (l == r) { ans[l] = getMax(); } else { int mid = l + r >> 1; dfs(lc, l, mid); dfs(rc, mid + 1, r); } cancel(oldsiz); }
voidprint(bs& w){ bool ok = 0; for (int i = BIT - 1; i >= 0; --i) { if (w[i]) ok = 1; if (ok) { cout << w[i]; } } if (!ok) cout << 0; cout << "\n"; }
voidsolve(){ cin >> n >> m >> q; for (int i = 0; i < BIT; ++i) basis[i].reset(); for (int i = 1; i <= n; ++i) eor[i].reset(); for (int i = 1; i <= n; ++i) fa[i] = i; for (int i = 1; i <= m; ++i) { int x, y; bs w; cin >> x >> y >> w; merge(x, y, w); } ans[0] = getMax(); m = 0; for (int i = 1; i <= q; ++i) { string s; cin >> s; if (s[0] == 'A') { m++; cin >> x[m] >> y[m] >> w[m]; last[m] = i; } elseif (s[1] == 'a') { int k; cin >> k; modify(1, 1, q, last[k], i - 1, x[k], y[k], w[k]); last[k] = 0; } else { int k; cin >> k; modify(1, 1, q, last[k], i - 1, x[k], y[k], w[k]); cin >> w[k]; last[k] = i; } } for (int i = 1; i <= m; ++i) { if (last[i]) modify(1, 1, q, last[i], q, x[i], y[i], w[i]); } if (q) { dfs(1, 1, q); } for (int i = 0; i <= q; ++i) { print(ans[i]); } }
#include<bits/stdc++.h> #define FIO cin.tie(0); ios::sync_with_stdio(false) #define all(x) (x).begin(), (x).end() #define fi first #define se second #define TEST #define TESTS int t = 1; cin >> t; while (t--)
// 基于x版本生成新版本的可持久化01trie intinsert(int v, int x){ int rt = ++cntt; ch[rt][0] = ch[x][0]; ch[rt][1] = ch[x][1]; cnt[rt] = cnt[x] + 1; for (int i = BIT, pre = rt, cur; i >= 0; --i, pre = cur) { int j = (v >> i) & 1; x = ch[x][j]; cur = ++cntt; ch[cur][0] = ch[x][0]; ch[cur][1] = ch[x][1]; cnt[cur] = cnt[x] + 1; ch[pre][j] = cur; } return rt; }
intquery(int v, int x, int y){ int ans = 0; for (int i = BIT; i >= 0; --i) { int j = (v >> i) & 1; if (cnt[ch[y][!j]] > cnt[ch[x][!j]]) { ans += 1 << i; x = ch[x][!j]; y = ch[y][!j]; } else { x = ch[x][j]; y = ch[y][j]; } } return ans; }
voidaddProduct(int u, int l, int r, int p, int i){ P[u].emplace_back(i); // addInfoP(u, i); if (l == r) return; int mid = l + r >> 1; if (p <= mid) addProduct(lc, l, mid, p, i); elseaddProduct(rc, mid + 1, r, p, i); }
voidaddBuy(int u, int l, int r, int ql, int qr, int i){ if (ql <= l && qr >= r) { B[u].emplace_back(i); // addInfoB(u, i); return; } int mid = l + r >> 1; if (ql <= mid) addBuy(lc, l, mid, ql, qr, i); if (qr > mid) addBuy(rc, mid + 1, r, ql, qr, i); }
voiddfs(int u, int l, int r){ int cnt = 0; for (int i : P[u]) { // for (int e = headp[u]; e; e = nextp[e]) { // int i = pid[e]; product[++cnt] = {qs[i], qv[i]}; } sort(product + 1, product + cnt + 1, [&](auto x, auto y) { return x[0] < y[0]; }); cntt = 0; for (int i = 1; i <= cnt; ++i) { root[i] = insert(product[i][1], root[i - 1]); } for (int i : B[u]) { // for (int e = headb[u]; e; e = nextb[e]) { // int i = bid[e]; int l = lower_bound(product + 1, product + 1 + cnt, ql[i], [&](auto x, int v) { return x[0] < v; }) - product; int r = lower_bound(product + 1, product + 1 + cnt, qr[i] + 1, [&](auto x, int v) { return x[0] < v; }) - product - 1; chkmax(ans[i], query(qx[i], root[l - 1], root[r])); } if (l < r) { int mid = l + r >> 1; dfs(lc, l, mid); dfs(rc, mid + 1, r); } }
voidsolve(){ cin >> n >> m; for (int i = 1; i <= n; ++i) cin >> arr[i]; int t = 0; for (int i = 1; i <= m; ++i) { cin >> op[i]; if (op[i] == 0) { t++; cin >> qs[i] >> qv[i]; } else { cin >> ql[i] >> qr[i] >> qx[i] >> qd[i]; } tim[i] = t; } for (int i = 1; i <= n; ++i) { root[i] = insert(arr[i], root[i - 1]); } for (int i = 1; i <= m; ++i) { if (op[i] == 0) { addProduct(1, 1, t, tim[i], i); } else { ans[i] = query(qx[i], root[ql[i] - 1], root[qr[i]]); int st = max(1, tim[i] - qd[i] + 1); if (st <= tim[i]) addBuy(1, 1, t, st, tim[i], i); } } dfs(1, 1, t); for (int i = 1; i <= m; ++i) if (op[i] == 1) cout << ans[i] << "\n"; }