Submission #720959

#TimeUsernameProblemLanguageResultExecution timeMemory
720959thimote75Birthday gift (IZhO18_treearray)C++14
56 / 100
4043 ms54724 KiB
#include <bits/stdc++.h> using namespace std; #define idata vector<int> #define graph vector<idata> const int MAX_K = 20; int nbNodes, seqSize, nbQuery; graph roads; idata depth; idata parents; graph parents_2k; void dfs (int node, int parent, int l_depth) { depth [node] = l_depth; parents [node] = parent; parents_2k[node][0] = parent; for (int next : roads[node]) if (next != parent) dfs(next, node, l_depth + 1); } void propagate () { for (int k = 0; k + 1 < MAX_K; k ++) { for (int i = 0; i < nbNodes; i ++) { if (parents_2k[i][k] == -1) continue ; parents_2k[i][k + 1] = parents_2k[parents_2k[i][k]][k]; } } } int jump (int n, int k) { for (int i = 0; i < MAX_K; i ++) if (((1 << i) & k) != 0) n = parents_2k[n][i]; return n; } int lca (int a, int b) { if (depth[a] > depth[b]) return lca(b, a); b = jump(b, depth[b] - depth[a]); if (a == b) return a; for (int i = MAX_K - 1; i >= 0; i --) { if (parents_2k[a][i] == parents_2k[b][i]) continue ; a = parents_2k[a][i]; b = parents_2k[b][i]; } if (a == b) return a; return parents[a]; } idata sequence; idata lca_sequence; void compute (int i) { lca_sequence[i] = lca(sequence[i], sequence[i + 1]); } int main () { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> nbNodes >> seqSize >> nbQuery; roads.resize(nbNodes); for (int iR = 1; iR < nbNodes; iR ++) { int a, b; cin >> a >> b; a --; b --; roads[a].push_back(b); roads[b].push_back(a); } depth .resize(nbNodes); parents .resize(nbNodes); parents_2k.resize(nbNodes, idata(MAX_K, -1)); dfs(0, -1, 0); propagate(); sequence.resize(seqSize); for (int i = 0; i < seqSize; i ++) { cin >> sequence[i]; sequence[i] --; } lca_sequence.resize(seqSize - 1); for (int i = 0; i + 1 < seqSize; i ++) compute(i); for (int iQ = 0; iQ < nbQuery; iQ ++) { int type, a, b, c; cin >> type >> a >> b; a --; b --; if (type == 2) { cin >> c; c --; int left = -1; int right = -1; for (int j = a; j <= b; j ++) { if (j != b && lca_sequence[j] == c) { left = j; right = j + 1; break ; } if (sequence[j] == c) { left = j; right = j; break; } } if (left == -1) cout << "-1 -1\n"; else cout << left + 1 << " " << right + 1 << endl; } else { sequence[a] = b; if (a != 0) compute(a - 1); if (a != seqSize) compute(a); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...