Submission #675060

#TimeUsernameProblemLanguageResultExecution timeMemory
675060YENGOYANBirthday gift (IZhO18_treearray)C++17
100 / 100
1028 ms83208 KiB
// eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee // // 271828___182845__904523__53602__ // // 87___47____13______52____66__24_ // // 97___75____72______47____09___36 // // 999595_____74______96____69___67 // // 62___77____24______07____66__30_ // // 35___35____47______59____45713__ // // eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee // #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <vector> #include <set> #include <map> #include <unordered_map> #include <unordered_map> #include <cmath> #include <climits> #include <algorithm> #include <random> #include <queue> #include <deque> #include <iomanip> #include <string> #include <tuple> #include <bitset> #include <chrono> #include <ctime> #include <fstream> #include <stack> #include <cstdio> using namespace std; using ll = long long; const int N = 1e5 + 5; const ll mod = 1e9 + 7, inf = 1e18; vector<int> a, tin, tout; map<pair<int, int>, int> p, s, lcas; vector<vector<int>> gp, up; int n, m, q, timer = 0; void dfs(int u, int p) { tin[u] = timer++; up[u][0] = p; for (int i = 1; i < 20; ++i) up[u][i] = up[up[u][i - 1]][i - 1]; for (int& v : gp[u]) { if (v != p) dfs(v, u); } tout[u] = timer++; } bool isok(int u, int v) { return tin[u] <= tin[v] && tout[u] >= tout[v]; } int lca(int u, int v) { if (isok(u, v)) return u; if (isok(v, u)) return v; for (int i = 19; i >= 0; --i) { if (!isok(up[u][i], v)) u = up[u][i]; } return up[u][0]; } pair<int, pair<int, int>> daq(int l, int r, int v) { if (l == r) { if (tin[a[l]] >= tin[v] && tout[a[l]] <= tout[v]) { p[{l, r}] = s[{l, r}] = 1; lcas[{l, r}] = a[l]; return { a[l], {l, l} }; } p[{l, r}] = s[{l, r}] = 0; lcas[{l, r}] = -1; return { -1, {-1, -1} }; } int m = (l + r) / 2; pair<int, pair<int, int>> L1 = daq(l, m, v), L2 = daq(m + 1, r, v); int ll1 = L1.first, ll2 = L2.first; if (ll1 == v) return L1; if (ll2 == v) return L2; int lst = s[{l, m}], fr = p[{m + 1, r}]; int s1 = m - l + 1, s2 = r - m; int l1 = m - lst + 1, r1 = m + fr; if (lst == s1) p[{l, r}] = s1 + fr; else p[{l, r}] = p[{l, m}]; if (fr == s2) s[{l, r}] = s2 + lst; else s[{l, r}] = s[{m + 1, r}]; // lcas -> l1 ... r1 // lcas[{l1, r1}] = lca(lcas[{l1, m}], lcas[{m + 1, r1}]); ll1 = lcas[{l1, m}], ll2 = lcas[{m + 1, r1}]; if (ll1 != -1 && ll2 != -1) lcas[{l1, r1}] = lca(ll1, ll2); else if (ll1 != -1) lcas[{l1, r1}] = ll1; else if (ll2 != -1) lcas[{l1, r1}] = ll2; else lcas[{l1, r1}] = -1; return { lcas[{l1, r1}], {l1, r1} }; } vector<set<pair<int, int>>> vst; void solve() { cin >> n >> m >> q; tin = tout = vector<int>(n); a = vector<int>(m); gp = vector<vector<int>>(n); up = vector<vector<int>>(n, vector<int>(20)); vst = vector<set<pair<int, int>>>(n); for (int i = 1; i < n; ++i) { int u, v; cin >> u >> v; gp[--u].push_back(--v); gp[v].push_back(u); } for (int i = 0; i < m; ++i) cin >> a[i], --a[i]; dfs(0, 0); for (int i = 0; i < m; ++i) { vst[a[i]].insert({ i, i }); if (i < m - 1) vst[lca(a[i], a[i + 1])].insert({ i, i + 1 }); } //for (auto x : vst[0]) cout <<"! " << x.first << " " << x.second << endl; while (q--) { int type; cin >> type; if (type == 2) { int l, r, v; cin >> l >> r >> v; --l, --r, --v; auto it = vst[v].lower_bound({ l, l }); if (it == vst[v].end()) { cout << "-1 -1\n"; continue; } pair<int, int> p = *it; if (p.second <= r) cout << p.first + 1 << ' ' << p.second + 1 << "\n"; else cout << "-1 -1\n"; } else { int i, val; cin >> i >> val; --i, --val; int v = a[i]; vst[v].erase({ i, i }); if (i) vst[lca(a[i], a[i - 1])].erase({ i - 1, i }); if (i < m - 1) vst[lca(a[i], a[i + 1])].erase({ i, i + 1 }); if(i) vst[lca(val, a[i - 1])].insert({ i - 1, i }); if(i < m - 1) vst[lca(val, a[i + 1])].insert({ i, i + 1 }); vst[val].insert({ i, i }); a[i] = val; } } } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); //int _; cin >> _; while (_--) 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...