Submission #338508

#TimeUsernameProblemLanguageResultExecution timeMemory
338508arujbansalBirthday gift (IZhO18_treearray)C++17
100 / 100
1511 ms78692 KiB
#include <bits/stdc++.h> #define rng_init mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()) using namespace std; using ll = long long; const int MAXN = 2e5 + 5, K = 20; int n, m, q, timer; int a[MAXN], tin[2 * MAXN], tout[2 * MAXN], par[MAXN][K]; vector<int> g[MAXN]; void dfs(int u, int p) { tin[u] = timer++; for (int j = 1; j < K; j++) par[u][j] = par[par[u][j - 1]][j - 1]; for (const auto &v : g[u]) { if (v == p) continue; par[v][0] = u; dfs(v, u); } tout[u] = timer - 1; } bool isAnc(int u, int v) { return tin[u] <= tin[v] && tout[u] >= tout[v]; } int query(int u, int v) { if (isAnc(u, v)) return u; if (isAnc(v, u)) return v; for (int j = K - 1; j >= 0; j--) if (!isAnc(par[u][j], v)) u = par[u][j]; return par[u][0]; } void solve() { cin >> n >> m >> q; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; u--, v--; g[u].push_back(v); g[v].push_back(u); } timer = 0; dfs(0, -1); set<pair<int, int>> individual; vector<set<int>> lca(n + 1); for (int i = 0; i < m; i++) { cin >> a[i]; a[i]--; individual.emplace(a[i], i); } for (int i = 0; i < m - 1; i++) { lca[query(a[i], a[i + 1])].insert(i); } while (q--) { int type; cin >> type; if (type == 1) { int pos, val; cin >> pos >> val; pos--, val--; individual.erase(make_pair(a[pos], pos)); if (pos > 0) lca[query(a[pos], a[pos - 1])].erase(pos - 1); if (pos < m - 1) lca[query(a[pos], a[pos + 1])].erase(pos); a[pos] = val; individual.emplace(a[pos], pos); if (pos > 0) lca[query(a[pos], a[pos - 1])].insert(pos - 1); if (pos < m - 1) lca[query(a[pos], a[pos + 1])].insert(pos); } else { int l, r, val; cin >> l >> r >> val; l--, r--, val--; auto single = individual.lower_bound(make_pair(val, l)); if (single != individual.end()) { int idx = (*single).second; if ((*single).first == val && l <= idx && idx <= r) { cout << idx + 1 << " " << idx + 1 << "\n"; continue; } } auto adjacent = lca[val].lower_bound(l); if (adjacent == lca[val].end() || *adjacent >= r) { cout << "-1 -1\n"; continue; } cout << *adjacent + 1 << " " << *adjacent + 2 << "\n"; } } } signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int tc = 1; // cin >> tc; while (tc--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...