#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>;
inlinecharnc(){ staticchar buf[1 << 20], *p1, *p2; return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF : *p1++; } #ifndef ONLINE_JUDGE #define nc getchar #endif voidread(){} template<typename T, typename... T2> inlinevoidread(T &x, T2 &... oth){ x = 0; char c = nc(), up = c; while(!isdigit(c)) up = c, c = nc(); while(isdigit(c)) x = x * 10 + c - '0', c = nc(); up == '-' ? x = -x : 0; read(oth...); }
constexprint N = 5e5 + 10; constexprint MOD = 998244353;
int a[N], v[N], bi[N], bl[N], br[N]; int blen, bnum;
voidbuild(int n){ blen = sqrt(n); bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; ++i) { bi[i] = (i - 1) / blen + 1; } for (int i = 1; i <= bnum; ++i) { bl[i] = (i - 1) * blen + 1; br[i] = min(n, i * blen); } for (int i = 1; i <= n; ++i) v[i] = a[i]; for (int i = 1; i <= bnum; ++i) { sort(v + bl[i], v + br[i] + 1); } }
intquery(int l, int r, int k){ int res = 0; if (bi[l] == bi[r]) { for (int i = l; i <= r; ++i) res += a[i] >= k; return res; } for (int i = l; i <= br[bi[l]]; ++i) { res += a[i] >= k; } for (int i = bi[l] + 1; i < bi[r]; ++i) { auto x = lower_bound(v + bl[i], v + br[i] + 1, k); res += (v + br[i] + 1 - x); } for (int i = bl[bi[r]]; i <= r; ++i) { res += a[i] >= k; } return res; }
voidmodify(int x, int k){ a[x] = k; for (int i = bl[bi[x]]; i <= br[bi[x]]; ++i) { v[i] = a[i]; } sort(v + bl[bi[x]], v + br[bi[x]] + 1); }
voidsolve(){ int n; read(n); for (int i = 1; i <= n; ++i) read(a[i]); build(n); int q; read(q); while (q--) { int op, a, b, c; read(op, a, b); if (op == 0) { read(c); cout << query(a, b, c) << "\n"; } else { modify(a, b); } } }
#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>;
inlinecharnc(){ staticchar buf[1 << 20], *p1, *p2; return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF : *p1++; } #ifndef ONLINE_JUDGE #define nc getchar #endif voidread(){} template<typename T, typename... T2> inlinevoidread(T &x, T2 &... oth){ x = 0; char c = nc(), up = c; while(!isdigit(c)) up = c, c = nc(); while(isdigit(c)) x = x * 10 + c - '0', c = nc(); up == '-' ? x = -x : 0; read(oth...); } template<typename... T2> inlinevoidread(char &x, T2 &... oth){ x = nc(); while (!isalpha(x)) x = nc(); read(oth...); }
constexprint N = 1e6 + 10; constexprint MOD = 998244353;
int a[N], v[N], bi[N], bl[N], br[N], lazy[N];
intquery(int l, int r, int k){ int res = 0; if (bi[l] == bi[r]) { for (int i = l; i <= r; ++i) { res += a[i] >= k - lazy[bi[l]]; } return res; } for (int i = l; i <= br[bi[l]]; ++i) { res += a[i] >= k - lazy[bi[l]]; } for (int i = bi[l] + 1; i < bi[r]; ++i) { auto x = lower_bound(v + bl[i], v + br[i] + 1, k - lazy[i]); res += (v + br[i] + 1 - x); } for (int i = bl[bi[r]]; i <= r; ++i) { res += a[i] >= k - lazy[bi[r]]; } return res; }
voidmodify(int l, int r, int k){ if (bi[l] == bi[r]) { for (int i = l; i <= r; ++i) { a[i] += k; } sort(v + bl[bi[l]], v + br[bi[l]] + 1); return; } for (int i = l; i <= br[bi[l]]; ++i) { a[i] += k; } sort(v + bl[bi[l]], v + br[bi[l]] + 1); for (int i = bi[l] + 1; i < bi[r]; ++i) { lazy[i] += k; } for (int i = bl[bi[r]]; i <= r; ++i) { a[i] += k; } sort(v + bl[bi[r]], v + br[bi[r]] + 1); }
voidsolve(){ int n, q; read(n, q); for (int i = 1; i <= n; ++i) read(a[i]), v[i] = a[i]; int blen = sqrt(n); int bnum = (n + blen - 1) / blen; for (int i = 1; i <= bnum; ++i) { bl[i] = (i - 1) * blen + 1; br[i] = min(n, i * blen); sort(v + bl[i], v + br[i] + 1); } while (q--) { char c; int l, r, k; read(c, l, r, k); if (c == 'A') { cout << query(l, r, k) << "\n"; } else { modify(l, r, k); } }
#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>;
inlinecharnc(){ staticchar buf[1 << 20], *p1, *p2; return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF : *p1++; } #ifndef ONLINE_JUDGE #define nc getchar #endif voidread(){} template<typename T, typename... T2> inlinevoidread(T &x, T2 &... oth){ x = 0; char c = nc(), up = c; while(!isdigit(c)) up = c, c = nc(); while(isdigit(c)) x = x * 10 + c - '0', c = nc(); up == '-' ? x = -x : 0; read(oth...); }
constexprint N = 4e4 + 10; constexprint B = 2e2 + 10; constexprint MOD = 998244353;
int a[N], v[N], bi[N], bl[B], br[B]; int freq[B][N], mode[B][B]; int cnt[N];
inlineintgetCnt(int l, int r, int v){ return freq[r][v] - freq[l - 1][v]; }
intquery(int l, int r){ int most = 0; if (bi[l] == bi[r]) { for (int i = l; i <= r; ++i) { cnt[a[i]]++; } for (int i = l; i <= r; ++i) { if (cnt[a[i]] > cnt[most] || (cnt[a[i]] == cnt[most] && a[i] < most)) { most = a[i]; } } for (int i = l; i <= r; ++i) { cnt[a[i]] = 0; } } else { for (int i = l; i <= br[bi[l]]; ++i) { cnt[a[i]]++; } for (int i = bl[bi[r]]; i <= r; ++i) { cnt[a[i]]++; } most = mode[bi[l] + 1][bi[r] - 1]; int mostCnt = getCnt(bi[l] + 1, bi[r] - 1, most) + cnt[most]; for (int i = l; i <= br[bi[l]]; ++i) { int cur = a[i]; int curCnt = getCnt(bi[l] + 1, bi[r] - 1, cur) + cnt[cur]; if (curCnt > mostCnt || (curCnt == mostCnt && cur < most)) { most = cur; mostCnt = curCnt; } } for (int i = bl[bi[r]]; i <= r; ++i) { int cur = a[i]; int curCnt = getCnt(bi[l] + 1, bi[r] - 1, cur) + cnt[cur]; if (curCnt > mostCnt || (curCnt == mostCnt && cur < most)) { most = cur; mostCnt = curCnt; } } for (int i = l; i <= br[bi[l]]; ++i) { cnt[a[i]] = 0; } for (int i = bl[bi[r]]; i <= r; ++i) { cnt[a[i]] = 0; } } return v[most]; }
voidsolve(){ int n, m; cin >> n >> m; for (int i = 1; i <= n; ++i) cin >> a[i], v[i] = a[i]; sort(v + 1, v + 1 + n); int s = unique(v + 1, v + 1 + n) - v - 1; for (int i = 1; i <= n; ++i) a[i] = lower_bound(v + 1, v + 1 + s, a[i]) - v; int blen = sqrt(n); int bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; ++i) { bi[i] = (i - 1) / blen + 1; } for (int i = 1; i <= bnum; ++i) { bl[i] = (i - 1) * blen + 1; br[i] = min(n, i * blen); } for (int i = 1; i <= bnum; ++i) { for (int j = bl[i]; j <= br[i]; ++j) { freq[i][a[j]]++; } for (int j = 1; j <= s; ++j) { freq[i][j] += freq[i - 1][j]; } } for (int i = 1; i <= bnum; ++i) { for (int j = i; j <= bnum; ++j) { int most = mode[i][j - 1]; int mostCnt = getCnt(i, j, most); for (int k = bl[j]; k <= br[j]; ++k) { int cur = a[k]; int curCnt = getCnt(i, j, cur); if (curCnt > mostCnt || (curCnt == mostCnt && cur < most)) { most = cur; mostCnt = curCnt; } } mode[i][j] = most; } } for (int x, y, lastans = 0; m; m--) { cin >> x >> y; auto [l, r] = minmax({(x + lastans - 1) % n + 1, (y + lastans - 1) % n + 1}); cout << (lastans = query(l, r)) << "\n"; } }
signedmain(){ FIO; TEST { solve(); }
return0; }
P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III
#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>;
inlinecharnc(){ staticchar buf[1 << 20], *p1, *p2; return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF : *p1++; } #ifndef ONLINE_JUDGE #define nc getchar #endif voidread(){} template<typename T, typename... T2> inlinevoidread(T &x, T2 &... oth){ x = 0; char c = nc(), up = c; while(!isdigit(c)) up = c, c = nc(); while(isdigit(c)) x = x * 10 + c - '0', c = nc(); up == '-' ? x = -x : 0; read(oth...); }
constexprint N = 5e5 + 10; constexprint B = 800; constexprint MOD = 998244353;
int a[N], listIdx[N], bi[N], bl[B], br[B]; int modeCnt[B][B]; int numCnt[N]; int n; array<int, 2> sortList[N];
intquery(int l, int r){ int ans = 0; if (bi[l] == bi[r]) { for (int i = l; i <= r; ++i) { ans = max(ans, ++numCnt[a[i]]); } for (int i = l; i <= r; ++i) { numCnt[a[i]] = 0; } } else { ans = modeCnt[bi[l] + 1][bi[r] - 1]; for (int i = l; i <= br[bi[l]]; ++i) { int idx = listIdx[i]; while (idx + ans <= n && sortList[idx + ans][0] == a[i] && sortList[idx + ans][1] <= r) { ans++; } } for (int i = bl[bi[r]]; i <= r; ++i) { int idx = listIdx[i]; while (idx - ans >= 1 && sortList[idx - ans][0] == a[i] && sortList[idx - ans][1] >= l) { ans++; } } } return ans; }
voidsolve(){ int m; cin >> n >> m; for (int i = 1; i <= n; ++i) { cin >> a[i]; sortList[i] = {a[i], i}; } sort(sortList + 1, sortList + 1 + n, [&](auto x, auto y) { if (x[0] != y[0]) return x[0] < y[0]; elsereturn x[1] < y[1]; }); for (int i = 1; i <= n; ++i) { listIdx[sortList[i][1]] = i; } int blen = sqrt(n); int bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; ++i) { bi[i] = (i - 1) / blen + 1; } for (int i = 1; i <= bnum; ++i) { bl[i] = (i - 1) * blen + 1; br[i] = min(n, i * blen); } for (int i = 1; i <= bnum; ++i) { for (int j = i; j <= bnum; ++j) { int cnt = modeCnt[i][j - 1]; for (int k = bl[j]; k <= br[j]; ++k) { cnt = max(cnt, ++numCnt[a[k]]); } modeCnt[i][j] = cnt; } for (int i = 1; i <= n; ++i) { numCnt[a[i]] = 0; } } for (int i = 0, l, r, lastAns = 0; i < m; ++i) { cin >> l >> r; l ^= lastAns; r ^= lastAns; cout << (lastAns = query(l, r)) << "\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>;
inlinecharnc(){ staticchar buf[1 << 20], *p1, *p2; return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF : *p1++; } #ifndef ONLINE_JUDGE #define nc getchar #endif voidread(){} template<typename T, typename... T2> inlinevoidread(T &x, T2 &... oth){ x = 0; char c = nc(), up = c; while(!isdigit(c)) up = c, c = nc(); while(isdigit(c)) x = x * 10 + c - '0', c = nc(); up == '-' ? x = -x : 0; read(oth...); }
constexprint N = 1e5 + 10; constexprint B = 400; constexprint MOD = 998244353;
int a[N], freq[B][N], even[B][B], bi[N], bl[B], br[B]; int numCnt[N];
inlineintgetCnt(int l, int r, int v){ return freq[r][v] - freq[l - 1][v]; }
inlineintdelta(int cnt){ if (cnt == 0) return0; if (cnt & 1) return1; return-1; }
intquery(int l, int r){ int ans = 0; if (bi[l] == bi[r]) { for (int i = l; i <= r; ++i) { ans += delta(numCnt[a[i]]); numCnt[a[i]]++; } for (int i = l; i <= r; ++i) { numCnt[a[i]] = 0; } } else { ans = even[bi[l] + 1][bi[r] - 1]; for (int i = l; i <= br[bi[l]]; ++i) { ans += delta(getCnt(bi[l] + 1, bi[r] - 1, a[i]) + numCnt[a[i]]); numCnt[a[i]]++; } for (int i = bl[bi[r]]; i <= r; ++i) { ans += delta(getCnt(bi[l] + 1, bi[r] - 1, a[i]) + numCnt[a[i]]); numCnt[a[i]]++; } for (int i = l; i <= br[bi[l]]; ++i) { numCnt[a[i]] = 0; } for (int i = bl[bi[r]]; i <= r; ++i) { numCnt[a[i]] = 0; } } return ans; }
voidsolve(){ int n, c, m; cin >> n >> c >> m; for (int i = 1; i <= n; ++i) { cin >> a[i]; } int blen = sqrt(n); int bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; ++i) { bi[i] = (i - 1) / blen + 1; } for (int i = 1; i <= bnum; ++i) { bl[i] = (i - 1) * blen + 1; br[i] = min(n, i * blen); } for (int i = 1; i <= bnum; ++i) { for (int j = bl[i]; j <= br[i]; ++j) { freq[i][a[j]]++; } for (int j = 1; j <= c; ++j) { freq[i][j] += freq[i - 1][j]; } } for (int i = 1; i <= bnum; ++i) { for (int j = i; j <= bnum; ++j) { even[i][j] = even[i][j - 1]; for (int k = bl[j]; k <= br[j]; ++k) { even[i][j] += delta(numCnt[a[k]]); numCnt[a[k]]++; } } for (int j = 1; j <= c; ++j) { numCnt[j] = 0; } } for (int x, y, lastAns = 0; m; --m) { cin >> x >> y; auto [l, r] = minmax({(x + lastAns) % n + 1, (y + lastAns) % n + 1}); cout << (lastAns = query(l, r)) << "\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>;
inlinecharnc(){ staticchar buf[1 << 20], *p1, *p2; return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF : *p1++; } #ifndef ONLINE_JUDGE #define nc getchar #endif voidread(){} template<typename T, typename... T2> inlinevoidread(T &x, T2 &... oth){ x = 0; char c = nc(), up = c; while(!isdigit(c)) up = c, c = nc(); while(isdigit(c)) x = x * 10 + c - '0', c = nc(); up == '-' ? x = -x : 0; read(oth...); }
constexprint N = 1e5 + 10; constexprint MOD = 998244353;
int a[N], sortv[N], bi[N], bl[N], br[N]; int lazy[N];
intqueryMin(int l, int r){ int res = inf; if (bi[l] == bi[r]) { for (int i = l; i <= r; ++i) res = min(res, a[i] + lazy[bi[l]]); } else { for (int i = l; i <= br[bi[l]]; ++i) { res = min(res, a[i] + lazy[bi[l]]); } for (int i = bi[l] + 1; i < bi[r]; ++i) { res = min(res, sortv[bl[i]] + lazy[i]); } for (int i = bl[bi[r]]; i <= r; ++i) { res = min(res, a[i] + lazy[bi[r]]); } } return res; }
intqueryMax(int l, int r){ int res = -inf; if (bi[l] == bi[r]) { for (int i = l; i <= r; ++i) res = max(res, a[i] + lazy[bi[l]]); } else { for (int i = l; i <= br[bi[l]]; ++i) { res = max(res, a[i] + lazy[bi[l]]); } for (int i = bi[l] + 1; i < bi[r]; ++i) { res = max(res, sortv[br[i]] + lazy[i]); } for (int i = bl[bi[r]]; i <= r; ++i) { res = max(res, a[i] + lazy[bi[r]]); } } return res; }
intgetBlockCnt(int i, int k){ k -= lazy[i]; int lo = bl[i], hi = br[i]; if (k < sortv[lo]) return0; if (k >= sortv[hi]) return hi - lo + 1; while (lo < hi) { int mid = lo + hi + 1 >> 1; if (sortv[mid] <= k) lo = mid; else hi = mid - 1; } return lo - bl[i] + 1; }
// 小于等于k的元素有多少个 intgetCnt(int l, int r, int k){ int res = 0; if (bi[l] == bi[r]) { for (int i = l; i <= r; ++i) res += (a[i] + lazy[bi[l]] <= k); } else { for (int i = l; i <= br[bi[l]]; ++i) res += (a[i] + lazy[bi[l]] <= k); for (int i = bl[bi[r]]; i <= r; ++i) res += (a[i] + lazy[bi[r]] <= k); for (int i = bi[l] + 1; i < bi[r]; ++i) { res += getBlockCnt(i, k); } } return res; }
intquery(int l, int r, int k){ if (k < 1 || k > r - l + 1) { return-1; } int lo = queryMin(l, r); int hi = queryMax(l, r); while (lo < hi) { int mid = lo + hi >> 1; if (getCnt(l, r, mid) < k) lo = mid + 1; else hi = mid; } return lo; }
voidinnerAdd(int l, int r, int k){ for (int i = l; i <= r; ++i) { a[i] += k; } for (int i = bl[bi[l]]; i <= br[bi[l]]; ++i) { sortv[i] = a[i]; } sort(sortv + bl[bi[l]], sortv + br[bi[l]] + 1); }
voidmodify(int l, int r, int k){ if (bi[l] == bi[r]) { innerAdd(l, r, k); } else { innerAdd(l, br[bi[l]], k); innerAdd(bl[bi[r]], r, k); for (int i = bi[l] + 1; i < bi[r]; ++i) { lazy[i] += k; } } }
voidsolve(){ int n, m; cin >> n >> m; for (int i = 1; i <= n; ++i) { cin >> a[i]; sortv[i] = a[i]; } int blen = sqrt(n / 2 + 1); int bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; ++i) { bi[i] = (i - 1) / blen + 1; } for (int i = 1; i <= bnum; ++i) { bl[i] = (i - 1) * blen + 1; br[i] = min(n, i * blen); sort(sortv + bl[i], sortv + br[i] + 1); } while (m--) { int op, l, r, k; cin >> op >> l >> r >> k; if (op == 1) { cout << query(l, r, k) << "\n"; } else { modify(l, r, k); } } }
#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>;
inlinecharnc(){ staticchar buf[1 << 20], *p1, *p2; return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF : *p1++; } #ifndef ONLINE_JUDGE #define nc getchar #endif voidread(){} template<typename T, typename... T2> inlinevoidread(T &x, T2 &... oth){ x = 0; char c = nc(), up = c; while(!isdigit(c)) up = c, c = nc(); while(isdigit(c)) x = x * 10 + c - '0', c = nc(); up == '-' ? x = -x : 0; read(oth...); }
constexprint N = 1e5 + 10; constexprint MOD = 998244353;
int a[N], t[N], v[N], bi[N], bl[N], br[N], lazy[N];
voidinnerAdd(int l, int r, int k){ for (int i = l; i <= r; ++i) { t[i] += k; } for (int i = bl[bi[l]]; i <= br[bi[l]]; ++i) { v[i] = t[i]; } sort(v + bl[bi[l]], v + br[bi[l]] + 1); }
voidmodify(int l, int r, int x){ if (bi[l] == bi[r]) { innerAdd(l, r, x); } else { innerAdd(l, br[bi[l]], x); innerAdd(bl[bi[r]], r, x); for (int i = bi[l] + 1; i < bi[r]; ++i) { lazy[i] += x; } } }
intquery(int l, int r, int x){ int res = 0; if (bi[l] == bi[r]) { for (int i = l; i <= r; ++i) res += (t[i] + lazy[bi[l]] >= x); } else { for (int i = l; i <= br[bi[l]]; ++i) res += (t[i] + lazy[bi[l]] >= x); for (int i = bl[bi[r]]; i <= r; ++i) res += (t[i] + lazy[bi[r]] >= x); for (int i = bi[l] + 1; i < bi[r]; ++i) { res += (v + br[i] + 1 - lower_bound(v + bl[i], v + br[i] + 1, x - lazy[i])); } } return res; }
voidsolve(){ int n, q; cin >> n >> q; for (int i = 1; i <= n; ++i) { cin >> a[i]; } q++; int blen = sqrt(q); int bnum = (q + blen - 1) / blen; for (int i = 1; i <= q; ++i) { bi[i] = (i - 1) / blen + 1; } for (int i = 1; i <= bnum; ++i) { bl[i] = (i - 1) * blen + 1; br[i] = min(i * blen, q); } vector<vector<array<int, 4>>> quer(n + 1); int cnt = 0; for (int i = 1; i < q; ++i) { int op, x, y, z = 0; cin >> op >> x >> y; if (op == 1) { cin >> z; quer[x].push_back({op, i, z}); if (y < n) quer[y + 1].push_back({op, i, -z}); } else { quer[x].push_back({op, i, y, cnt++}); } } vector<int> ans(cnt); for (int i = 1; i <= n; ++i) { for (auto [op, t, x, id] : quer[i]) { if (op == 1) { modify(t + 1, q, x); } else { ans[id] = query(1, t, x - a[i]); } } } for (int i = 0; i < cnt; ++i) 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--)
#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--)
#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>;
inlinecharnc(){ staticchar buf[1 << 20], *p1, *p2; return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF : *p1++; } #ifndef ONLINE_JUDGE #define nc getchar #endif voidread(){} template<typename T, typename... T2> inlinevoidread(T &x, T2 &... oth){ x = 0; char c = nc(), up = c; while(!isdigit(c)) up = c, c = nc(); while(isdigit(c)) x = x * 10 + c - '0', c = nc(); up == '-' ? x = -x : 0; read(oth...); }
constexprint N = 1e5 + 10; constexprint B = 800; constexprint V = 3e4 + 10; constexprint MOD = 998244353;
int a[N], bi[N], bl[B], br[B]; int fa[N], dep[N], sz[N], son[N], top[N], dfn[N], val[N], idx; vector<int> e[N]; bitset<V> st[B], ans;
voiddfs1(int u, int f){ fa[u] = f; dep[u] = dep[f] + 1; sz[u] = 1; for (int v : e[u]) { if (v == f) continue; dfs1(v, u); sz[u] += sz[v]; if (sz[son[u]] < sz[v]) son[u] = v; } }
voiddfs2(int u, int t){ top[u] = t; val[dfn[u] = ++idx] = a[u]; if (!son[u]) return; dfs2(son[u], t); for (int v : e[u]) { if (top[v]) continue; dfs2(v, v); } }
voidquery(int l, int r){ if (bi[l] == bi[r]) { for (int i = l; i <= r; ++i) { ans.set(val[i]); } } else { for (int i = l; i <= br[bi[l]]; ++i) { ans.set(val[i]); } for (int i = bl[bi[r]]; i <= r; ++i) { ans.set(val[i]); } for (int i = bi[l] + 1; i < bi[r]; ++i) { ans |= st[i]; } } }
voidupdate(int u, int v){ while (top[u] != top[v]) { if (dep[top[u]] < dep[top[v]]) swap(u, v); query(dfn[top[u]], dfn[u]); u = fa[top[u]]; } if (dep[u] < dep[v]) swap(u, v); query(dfn[v], dfn[u]); }
pii calc(){ int r1 = ans.count(); ans.flip(); int r2 = ans._Find_first(); return {r1, r2}; }
voidsolve(){ int n, m, f; cin >> n >> m >> f; int blen = sqrt(n * 20); int bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; ++i) { cin >> a[i]; bi[i] = (i - 1) / blen + 1; } for (int i = 0, u, v; i < n - 1; ++i) { cin >> u >> v; e[u].push_back(v); e[v].push_back(u); } dfs1(1, 0); dfs2(1, 1); for (int i = 1; i <= bnum; ++i) { bl[i] = (i - 1) * blen + 1; br[i] = min(n, i * blen); for (int j = bl[i]; j <= br[i]; ++j) { st[i].set(val[j]); } } for (int k, lastAns = 0; m; --m) { cin >> k; ans.reset(); while (k--) { int x, y; cin >> x >> y; if (f) { x ^= lastAns; y ^= lastAns; } update(x, y); } auto [r1, r2] = calc(); lastAns = r1 + r2; cout << r1 << " " << r2 << "\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>;
inlinecharnc(){ staticchar buf[1 << 20], *p1, *p2; return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF : *p1++; } #ifndef ONLINE_JUDGE #define nc getchar #endif voidread(){} template<typename T, typename... T2> inlinevoidread(T &x, T2 &... oth){ x = 0; char c = nc(), up = c; while(!isdigit(c)) up = c, c = nc(); while(isdigit(c)) x = x * 10 + c - '0', c = nc(); up == '-' ? x = -x : 0; read(oth...); }
constexprint N = 1e5 + 10; constexprint B = 800 + 10; constexprint P = 20; constexprint V = 3e4 + 10; constexprint MOD = 998244353;
int a[N]; int fa[N][P], d[N]; int vis[N], markNode[N], nodeNum[N], up[N]; vector<int> e[N]; bitset<V> st[B], ans;
mt19937 rng(time(0));
voiddfs(int u, int f){ d[u] = d[f] + 1; fa[u][0] = f; for (int i = 1; i < P; ++i) { fa[u][i] = fa[fa[u][i - 1]][i - 1]; } for (int v : e[u]) { if (v == f) continue; dfs(v, u); } }
intgetLca(int u, int v){ if (d[u] < d[v]) swap(u, v); for (int i = P - 1; i >= 0; --i) { if (d[fa[u][i]] >= d[v]) u = fa[u][i]; } if (u == v) return u; for (int i = P - 1; i >= 0; --i) { if (fa[u][i] != fa[v][i]) { u = fa[u][i]; v = fa[v][i]; } } return fa[u][0]; }
voidquery(int x, int lca){ while (nodeNum[x] == 0 && x != lca) { ans.set(a[x]); x = fa[x][0]; } while (up[x] > 0 && d[up[x]] >= d[lca]) { ans |= st[nodeNum[x]]; x = up[x]; } while (x != lca) { ans.set(a[x]); x = fa[x][0]; } }
voidupdateAns(int x, int y){ int lca = getLca(x, y); query(x, lca); query(y, lca); ans.set(a[lca]); }
pii calc(){ int r1 = ans.count(); int r2 = ((~ans)._Find_first()); return {r1, r2}; }
voidsolve(){ int n, m, f; cin >> n >> m >> f; int blen = sqrt(n * 10); int bnum = (n + blen - 1) / blen; for (int i = 1; i <= n; ++i) { cin >> a[i]; } for (int i = 0, u, v; i < n - 1; ++i) { cin >> u >> v; e[u].push_back(v); e[v].push_back(u); } dfs(1, 0); for (int i = 1, x; i <= bnum; ++i) { do { x = rng() % n + 1; } while (vis[x]); vis[x] = 1; markNode[i] = x; nodeNum[x] = i; } for (int i = 1; i <= bnum; ++i) { st[i].set(a[markNode[i]]); int cur = fa[markNode[i]][0]; while (cur != 0) { if (nodeNum[cur] > 0) { up[markNode[i]] = cur; break; } else { st[i].set(a[cur]); cur = fa[cur][0]; } } } for (int k, lastAns = 0; m; --m) { ans.reset(); cin >> k; while (k--) { int x, y; cin >> x >> y; if (f) { x ^= lastAns; y ^= lastAns; } updateAns(x, y); } auto [r1, r2] = calc(); lastAns = r1 + r2; cout << r1 << " " << r2 << "\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>;
inlinecharnc(){ staticchar buf[1 << 20], *p1, *p2; return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF : *p1++; } #ifndef ONLINE_JUDGE #define nc getchar #endif voidread(){} template<typename T, typename... T2> inlinevoidread(T &x, T2 &... oth){ x = 0; char c = nc(), up = c; while(!isdigit(c)) up = c, c = nc(); while(isdigit(c)) x = x * 10 + c - '0', c = nc(); up == '-' ? x = -x : 0; read(oth...); }
constexprint N = 1e5 + 10; constexprint B = 400; constexprint MOD = 998244353;
int a[N], bi[N], bl[B], br[B]; int sum1[B][B], sum2[B][N], cnt1[B], cnt2[N]; int idxset[N], valset[B][N], setval[B][N]; int blen, bnum; int n, m;
voidbuild(int b){ for (int i = 1; i <= blen; ++i) { valset[b][setval[b][i]] = 0; } for (int i = bl[b], s = 0; i <= br[b]; ++i) { if (valset[b][a[i]] == 0) { valset[b][a[i]] = ++s; setval[b][s] = a[i]; } idxset[i] = valset[b][a[i]]; } }
voidlazy(int b, int x, int y){ valset[b][y] = valset[b][x]; setval[b][valset[b][x]] = y; valset[b][x] = 0; }
voiddown(int b){ for (int i = bl[b]; i <= br[b]; ++i) { a[i] = setval[b][idxset[i]]; } }
voidinnerUpdate(int l, int r, int x, int y){ down(bi[l]); for (int i = l; i <= r; ++i) { if (a[i] != x) continue; sum1[bi[i]][bi[x]]--; sum1[bi[i]][bi[y]]++; sum2[bi[i]][x]--; sum2[bi[i]][y]++; a[i] = y; } build(bi[l]); }
voidupdate(int l, int r, int x, int y){ if (x == y || sum2[bi[r]][x] - sum2[bi[l] - 1][x] == 0) { return; } for (int b = bi[n]; b >= bi[l]; --b) { sum1[b][bi[x]] -= sum1[b - 1][bi[x]]; sum1[b][bi[y]] -= sum1[b - 1][bi[y]]; sum2[b][x] -= sum2[b - 1][x]; sum2[b][y] -= sum2[b - 1][y]; } if (bi[l] == bi[r]) { innerUpdate(l, r, x, y); } else { innerUpdate(l, br[bi[l]], x, y); innerUpdate(bl[bi[r]], r, x, y); for (int i = bi[l] + 1; i < bi[r]; ++i) { if (sum2[i][x] == 0) continue; if (sum2[i][y] != 0) { innerUpdate(bl[i], br[i], x, y); } else { sum1[i][bi[y]] += sum2[i][x]; sum1[i][bi[x]] -= sum2[i][x]; sum2[i][y] += sum2[i][x]; sum2[i][x] = 0; lazy(i, x, y); } } } for (int b = bi[l]; b <= bi[n]; ++b) { sum1[b][bi[x]] += sum1[b - 1][bi[x]]; sum1[b][bi[y]] += sum1[b - 1][bi[y]]; sum2[b][x] += sum2[b - 1][x]; sum2[b][y] += sum2[b - 1][y]; } }
voidaddCnt(int l, int r){ for (int i = l; i <= r; ++i) { cnt1[bi[a[i]]]++; cnt2[a[i]]++; } }
voidclearCnt(int l, int r){ for (int i = l; i <= r; ++i) { cnt1[bi[a[i]]] = cnt2[a[i]] = 0; } }
intquery(int l, int r, int k){ int ans = 0; bool inner = bi[l] == bi[r]; if (inner) { down(bi[l]); addCnt(l, r); } else { down(bi[l]); down(bi[r]); addCnt(l, br[bi[l]]); addCnt(bl[bi[r]], r); } int sumCnt = 0; int vBlock = 0; for (int i = 1; i <= bi[N - 1]; ++i) { int cnt = cnt1[i] + (inner ? 0 : sum1[bi[r] - 1][i] - sum1[bi[l]][i]); if (sumCnt + cnt >= k) { vBlock = i; break; } else { sumCnt += cnt; } } for (int i = (vBlock - 1) * blen + 1; i <= vBlock * blen; ++i) { int cnt = cnt2[i] + (inner ? 0 : sum2[bi[r] - 1][i] - sum2[bi[l]][i]); if (sumCnt + cnt >= k) { ans = i; break; } else { sumCnt += cnt; } } if (inner) { clearCnt(l, r); } else { clearCnt(l, br[bi[l]]); clearCnt(bl[bi[r]], r); } return ans; }
voidsolve(){ read(n, m); for (int i = 1; i <= n; ++i) { read(a[i]); } blen = 400; bnum = (n + blen - 1) / blen; for (int i = 1; i < N; ++i) { bi[i] = (i - 1) / blen + 1; } for (int i = 1; i <= bnum; ++i) { bl[i] = (i - 1) * blen + 1; br[i] = min(n, i * blen); build(i); } for (int i = 1; i <= bnum; ++i) { for (int j = 1; j < B; ++j) { // 改成+=就 TLE // why? sum1[i][j] = sum1[i - 1][j]; } for (int j = 1; j < N; ++j) { sum2[i][j] = sum2[i - 1][j]; } for (int j = bl[i]; j <= br[i]; ++j) { sum1[i][bi[a[j]]]++; sum2[i][a[j]]++; } } for (int i = 0; i < m; ++i) { int op, l, r, x, y; read(op, l, r, x); if (op == 1) { read(y); update(l, r, x, y); } else { cout << query(l, r, x) << "\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>;
inlinecharnc(){ staticchar buf[1 << 20], *p1, *p2; return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF : *p1++; } #ifndef ONLINE_JUDGE #define nc getchar #endif voidread(){} template<typename T, typename... T2> inlinevoidread(T &x, T2 &... oth){ x = 0; char c = nc(), up = c; while(!isdigit(c)) up = c, c = nc(); while(isdigit(c)) x = x * 10 + c - '0', c = nc(); up == '-' ? x = -x : 0; read(oth...); }
constexprint N = 3e5 + 10; constexprint B = 600 + 10; constexprint P = 9; constexprint OFFSET = (1 << P) - 1; constexprint MOD = 998244353;
int a[N]; int op[N], x[N], y[N], v[N]; int pos[N], qid[N], cntp, cntq; int cntv[N], help[N]; int lst[N], nxt[N]; int pre[N], suf[N], len[N]; i64 ans[N]; int n, m;
voidradix(int idx[], int val[], int siz){ memset(cntv, 0, sizeof(int) * B); for (int i = 1; i <= siz; ++i) cntv[val[idx[i]] & OFFSET]++; for (int i = 1; i < B; ++i) cntv[i] += cntv[i - 1]; for (int i = siz; i >= 1; --i) help[cntv[val[idx[i]] & OFFSET]--] = idx[i]; memcpy(idx + 1, help + 1, siz * sizeof(int)); memset(cntv, 0, sizeof(int) * B); for (int i = 1; i <= siz; ++i) cntv[val[idx[i]] >> P]++; for (int i = 1; i < B; ++i) cntv[i] += cntv[i - 1]; for (int i = siz; i >= 1; --i) help[cntv[val[idx[i]] >> P]--] = idx[i]; memcpy(idx + 1, help + 1, siz * sizeof(int)); }
voidcalc(int l, int r){ for (int i = l; i <= r; ++i) { pos[++cntp] = i; lst[i] = i - 1; nxt[i] = i + 1; } radix(pos, a, cntp); radix(qid, v, cntq); int curPre = 0, curSuf = 0, curLen = r - l + 1; i64 curAns = 0; for (int i = 1, j = 1, idx; i <= cntq; ++i) { while (j <= cntp && a[pos[j]] <= v[qid[i]]) { idx = pos[j]; if (lst[idx] == l - 1) { curPre += nxt[idx] - idx; } if (nxt[idx] == r + 1) { curSuf += idx - lst[idx]; } curAns += 1LL * (nxt[idx] - idx) * (idx - lst[idx]); lst[nxt[idx]] = lst[idx]; nxt[lst[idx]] = nxt[idx]; j++; } ::merge(qid[i], curPre, curSuf, curLen, curAns); } cntp = cntq = 0; }
voidcompute(int l, int r){ for (int i = 1; i <= m; ++i) { if (op[i] == 1) { if (l <= x[i] && x[i] <= r) { calc(l, r); a[x[i]] = v[i]; } } else { if (x[i] <= l && r <= y[i]) { qid[++cntq] = i; } else { for (int j = max(x[i], l); j <= min(y[i], r); ++j) { if (a[j] <= v[i]) { ::merge(i, 1, 1, 1, 1); } else { ::merge(i, 0, 0, 1, 0); } } } } } calc(l, r); }
voidsolve(){ read(n, m); for (int i = 1; i <= n; ++i) read(a[i]); for (int i = 1; i <= m; ++i) { read(op[i]); if (op[i] == 1) { read(x[i], v[i]); } else { read(x[i], y[i], v[i]); } } int blen = 1 << P; int bnum = (n + blen - 1) / blen; for (int i = 1; i <= bnum; ++i) { int l = (i - 1) * blen + 1; int r = min(i * blen, n); compute(l, r); } for (int i = 1; i <= m; ++i) { if (op[i] == 2) { cout << ans[i] << "\n"; } } }