Submission #155085

#TimeUsernameProblemLanguageResultExecution timeMemory
155085theboatmanBirthday gift (IZhO18_treearray)C++17
56 / 100
739 ms262144 KiB
#include <bits/stdc++.h> #define y1 theboatman #define make_struct(args...) {args} using namespace std; struct Tree { struct node { int sum; node *l, *r; node() : sum(0), l(nullptr), r(nullptr) {} }; node *root; int tl, tr; void init(int n) { tl = 1; tr = n; root = new node(); } void add(node *v) { if (v -> l == nullptr) { v -> l = new node(); } if (v -> r == nullptr) { v -> r = new node(); } } void modify(node *v, int tl, int tr, int pos, int val) { if (tl == tr) { v -> sum += val; } else { add(v); int tm = tl + tr >> 1; if (pos <= tm) { modify(v -> l, tl, tm, pos, val); } else { modify(v -> r, tm + 1, tr, pos, val); } v -> sum = v -> l -> sum + v -> r -> sum; } } void modify(int pos, int val) { modify(root, tl, tr, pos, val); } int find_pos(node *v, int tl, int tr) { if (tl == tr) { if (v -> sum) { return tl; } else { return int(1e9); } } add(v); int tm = tl + tr >> 1; if (v -> l -> sum) { return find_pos(v -> l, tl, tm); } else { return find_pos(v -> r, tm + 1, tr); } } int get(node *v, int tl, int tr, int l, int r) { if (l > r) { return int(1e9); } if (tl == l && tr == r) { return find_pos(v, tl, tr); } add(v); int tm = tl + tr >> 1; int ql = get(v -> l, tl, tm, l, min(r, tm)); int qr = get(v -> r, tm + 1, tr, max(l, tm + 1), r); return min(ql, qr); } int get(int l, int r) { return get(root, tl, tr, l, r); } }; struct Lca { int n, bit, timer; vector <int> tin, tout; vector <vector <int> > g, up; void dfs(int v, int from) { tin[v] = timer++; up[v][0] = from; for(int i = 1; i < bit; i++) { up[v][i] = up[up[v][i - 1]][i - 1]; } for(auto to : g[v]) { if (to != from) { dfs(to, v); } } tout[v] = timer++; } void build(vector <vector <int> > &temp_graph) { g = temp_graph; n = g.size(); bit = 0; while((1 << bit) <= n) { bit++; } bit--; tin.resize(n); tout.resize(n); up.resize(n, vector <int> (bit, 1)); timer = 0; dfs(1, 1); } bool upper(int a, int b) { return tin[a] <= tin[b] && tout[a] >= tout[b]; } int get(int a, int b) { if (upper(a, b)) { return a; } if (upper(b, a)) { return b; } for(int i = bit - 1; i > -1; i--) { if (!upper(up[a][i], b)) { a = up[a][i]; } } return up[a][0]; } }; int main() { cin.tie(0); ios::sync_with_stdio(0); int n, m, q; cin >> n >> m >> q; vector <vector <int> > g(n + 1); for(int i = 0; i < n - 1; i++) { int x, y; cin >> x >> y; g[x].push_back(y); g[y].push_back(x); } vector <int> a(m + 1); for(int i = 1; i <= m; i++) { cin >> a[i]; } Lca lca; lca.build(g); vector <Tree> tree(n + 1); for(int i = 1; i <= n; i++) { tree[i].init(m); } for(int i = 2; i <= m; i++) { int c = lca.get(a[i], a[i - 1]); tree[c].modify(i - 1, 1); } for(int i = 1; i <= m; i++) { tree[a[i]].modify(i, 1); } for(int it = 0; it < q; it++) { int type; cin >> type; if (type == 1) { int pos, val; cin >> pos >> val; for(int i = max(pos, 2); i <= min(n, pos + 1); i++) { int c = lca.get(a[i], a[i - 1]); tree[c].modify(i - 1, -1); } tree[a[pos]].modify(pos, -1); a[pos] = val; tree[a[pos]].modify(pos, 1); for(int i = max(pos, 2); i <= min(n, pos + 1); i++) { int c = lca.get(a[i], a[i - 1]); tree[c].modify(i - 1, 1); } } else { int l, r, c; cin >> l >> r >> c; int pos = tree[c].get(l, r); if (pos > r || pos + (a[pos] != c) > r) { cout << "-1 -1\n"; } else { cout << pos << " " << pos + (a[pos] != c) << "\n"; } } } return 0; } /* */

Compilation message (stderr)

treearray.cpp: In member function 'void Tree::modify(Tree::node*, int, int, int, int)':
treearray.cpp:47:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
             int tm = tl + tr >> 1;
                      ~~~^~~~
treearray.cpp: In member function 'int Tree::find_pos(Tree::node*, int, int)':
treearray.cpp:75:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
         int tm = tl + tr >> 1;
                  ~~~^~~~
treearray.cpp: In member function 'int Tree::get(Tree::node*, int, int, int, int)':
treearray.cpp:95:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
         int tm = tl + tr >> 1;
                  ~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...