diff --git a/src/2/22/T294677.cpp b/src/2/22/T294677.cpp new file mode 100644 index 0000000..6e7e91e --- /dev/null +++ b/src/2/22/T294677.cpp @@ -0,0 +1,141 @@ +#include +using namespace std; + + +struct SegmentTree { + int n; + vector tree; + SegmentTree(int size) { + n = size; + tree.assign(4 * n + 4, 0); + } + void build(vector &last, int node, int l, int r) { + if (l == r) { + tree[node] = last[l]; + } else { + int mid = (l + r) / 2; + build(last, 2 * node, l, mid); + build(last, 2 * node + 1, mid + 1, r); + tree[node] = max(tree[2 * node], tree[2 * node + 1]); + } + } + void upd(int node, int l, int r, int pos, int val) { + if (l == r) { + tree[node] = val; + } else { + int mid = (l + r) / 2; + if (pos <= mid) + upd(2 * node, l, mid, pos, val); + else + upd(2 * node + 1, mid + 1, r, pos, val); + tree[node] = max(tree[2 * node], tree[2 * node + 1]); + } + } + int getmax(int node, int l, int r, int L, int R) { + if (r < L || l > R) + return -1; + if (L <= l && r <= R) + return tree[node]; + int mid = (l + r) / 2; + return max(getmax(2 * node, l, mid, L, R), + getmax(2 * node + 1, mid + 1, r, L, R)); + } +}; +int main() { + ios::sync_with_stdio(false); + cin.tie(0); + int n, q; + cin >> n >> q; + vector a(n + 1); + for (int i = 1; i <= n; i++) + cin >> a[i]; + const int MAX_COLOR = 1000001; + vector *> cp(MAX_COLOR, nullptr); + for (int i = 1; i <= n; i++) { + int c = a[i]; + if (cp[c] == nullptr) { + cp[c] = new set(); + } + cp[c]->insert(i); + } + vector last(n + 1, 0); + for (int c = 0; c < MAX_COLOR; c++) { + if (cp[c] == nullptr) + continue; + int prev = 0; + for (auto it = cp[c]->begin(); it != cp[c]->end(); + ++it) { + int pos = *it; + last[pos] = prev; + prev = pos; + } + } + SegmentTree st(n); + st.build(last, 1, 1, n); + while (q--) { + int type; + cin >> type; + if (type == 1) { + int id, x; + cin >> id >> x; + int c_old = a[id]; + if (c_old == x) { + continue; + } + if (cp[c_old] != nullptr) { + auto it_old = cp[c_old]->find(id); + if (it_old != cp[c_old]->end()) { + int p_prev = 0; + if (it_old != cp[c_old]->begin()) { + auto it_prev = it_old; + --it_prev; + p_prev = *it_prev; + } + auto it_next = it_old; + ++it_next; + if (it_next != cp[c_old]->end()) { + int p_next = *it_next; + last[p_next] = p_prev; + st.upd(1, 1, n, p_next, last[p_next]); + } + cp[c_old]->erase(it_old); + } + } + if (cp[x] == nullptr) { + cp[x] = new set(); + } + auto &s_new = *cp[x]; + auto it_new = s_new.lower_bound(id); + int ppn = 0; + if (it_new != s_new.begin()) { + auto it_prev_new = it_new; + --it_prev_new; + ppn = *it_prev_new; + } + int pnn = 0; + if (it_new != s_new.end()) { + pnn = *it_new; + } + s_new.insert(id); + last[id] = ppn; + st.upd(1, 1, n, id, last[id]); + if (pnn != 0) { + last[pnn] = id; + st.upd(1, 1, n, pnn, last[pnn]); + } + a[id] = x; + } else if (type == 2) { + int l, r; + cin >> l >> r; + int max_last = st.getmax(1, 1, n, l, r); + if (max_last >= l) { + cout << "yes\n"; + } else { + cout << "no\n"; + } + } + } + for (int c = 0; c < MAX_COLOR; c++) + if (cp[c] != nullptr) + delete cp[c]; +} \ No newline at end of file diff --git a/src/2/22/T461834.cpp b/src/2/22/T461834.cpp new file mode 100644 index 0000000..8d35379 --- /dev/null +++ b/src/2/22/T461834.cpp @@ -0,0 +1,98 @@ +#include +using namespace std; +typedef long long ll; +const int MAX = 300005; +const int MOD = 998244353; +ll c[MAX]; +ll psc[MAX]; +ll a_init[MAX]; +struct SegNode { + int l, r; + ll sum_a_c; + ll lazy; +} tree_nodes[4 * MAX]; +int n, m; +ll safe(ll x, ll y) { return (x - y + MOD) % MOD; } +void build(int node, int l, int r) { + tree_nodes[node].l = l; + tree_nodes[node].r = r; + tree_nodes[node].lazy = -1; + if (l == r) { + tree_nodes[node].sum_a_c = (a_init[l] % MOD) * c[l] % MOD; + return; + } + int mid = (l + r) / 2; + build(2 * node, l, mid); + build(2 * node + 1, mid + 1, r); + tree_nodes[node].sum_a_c = + (tree_nodes[2 * node].sum_a_c + tree_nodes[2 * node + 1].sum_a_c) % MOD; +} +void pushdown(int node) { + if (tree_nodes[node].lazy != -1) { + ll x = tree_nodes[node].lazy; + int left = 2 * node; + int l_start = tree_nodes[left].l; + int l_end = tree_nodes[left].r; + ll sum_c_left = safe(psc[l_end], psc[l_start - 1]); + tree_nodes[left].sum_a_c = (x % MOD) * sum_c_left % MOD; + tree_nodes[left].lazy = x; + int right = 2 * node + 1; + int r_start = tree_nodes[right].l; + int r_end = tree_nodes[right].r; + ll sum_c_right = safe(psc[r_end], psc[r_start - 1]); + tree_nodes[right].sum_a_c = (x % MOD) * sum_c_right % MOD; + tree_nodes[right].lazy = x; + tree_nodes[node].lazy = -1; + } +} +void getrange(int node, int l, int r, ll x) { + if (tree_nodes[node].l > r || tree_nodes[node].r < l) + return; + if (tree_nodes[node].l >= l && tree_nodes[node].r <= r) { + ll sum_c = safe(psc[tree_nodes[node].r], + psc[tree_nodes[node].l - 1]); + tree_nodes[node].sum_a_c = (x % MOD) * sum_c % MOD; + tree_nodes[node].lazy = x; + return; + } + pushdown(node); + getrange(2 * node, l, r, x); + getrange(2 * node + 1, l, r, x); + tree_nodes[node].sum_a_c = + (tree_nodes[2 * node].sum_a_c + tree_nodes[2 * node + 1].sum_a_c) % MOD; +} +ll query_sum(int node, int l, int r) { + if (tree_nodes[node].l > r || tree_nodes[node].r < l) + return 0; + if (tree_nodes[node].l >= l && tree_nodes[node].r <= r) { + return tree_nodes[node].sum_a_c; + } + pushdown(node); + ll res = (query_sum(2 * node, l, r) + query_sum(2 * node + 1, l, r)) % MOD; + return res; +} +int main() { + ios::sync_with_stdio(false); + cin.tie(0); + cin >> n >> m; + for (int i = 1; i <= n; i++) + cin >> a_init[i]; + for (int i = 1; i <= n; i++) { + c[i] = (1LL * i * (n - i + 1)) % MOD; + } + psc[0] = 0; + for (int i = 1; i <= n; i++) { + psc[i] = (psc[i - 1] + c[i]) % MOD; + } + build(1, 1, n); + ll total = query_sum(1, 1, n); + cout << total % MOD << "\n"; + for (int i = 0; i < m; i++) { + int l, r; + ll x; + cin >> l >> r >> x; + getrange(1, l, r, x % MOD); + total = query_sum(1, 1, n); + cout << total % MOD << "\n"; + } +} \ No newline at end of file diff --git a/src/3/T225686.cpp b/src/3/T225686.cpp new file mode 100644 index 0000000..294989d --- /dev/null +++ b/src/3/T225686.cpp @@ -0,0 +1,3 @@ +int main(){ + +} \ No newline at end of file