# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
27155 | wwiiiii | 트리 (KOI16_tree) | C++14 | 2000 ms | 38536 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <cstdio>
#include <vector>
#include <queue>
#include <set>
using namespace std;
const int N = 200100;
set<int> adj[N];
int parent[N];
int treeidx[N];
int n, q, maxidx, visitmax;
int visited[N];
void reindex(int node) {
treeidx[node] = maxidx;
for (auto next : adj[node]) {
if (treeidx[next] != maxidx) {
treeidx[next] = maxidx;
reindex(next);
}
}
}
void cut(int node)
{
visitmax++;
if (node == parent[node]) return;
adj[node].erase(parent[node]);
adj[parent[node]].erase(node);
queue<int> q, pq;
q.push(node); pq.push(parent[node]);
int qnow = -1, pqnow = -1;
set<int>::iterator qit, pqit;
while ((!q.empty()) && (!pq.empty()))
{
while (qnow == -1 || qit == adj[qnow].end()) {
if (q.empty()) break;
qnow = q.front(); q.pop();
qit = adj[qnow].begin();
while (qit != adj[qnow].end() && visited[*qit] == visitmax) qit++;
}
if (!q.empty()) {
visited[*qit] = visitmax;
q.push(*qit); qit++;
}
while (pqnow == -1 || pqit == adj[pqnow].end()) {
if (pq.empty()) break;
pqnow = pq.front(); pq.pop();
pqit = adj[pqnow].begin();
while (pqit != adj[pqnow].end() && visited[*pqit] == visitmax) pqit++;
}
if (!pq.empty()) {
visited[*qit] = visitmax;
pq.push(*pqit); pqit++;
}
}
maxidx++;
if (q.empty()) reindex(node);
else reindex(parent[node]);
parent[node] = node;
}
int main()
{
scanf("%d %d", &n, &q);
for (int i = 2; i <= n; i++) {
scanf("%d", &parent[i]);
adj[parent[i]].insert(i);
adj[i].insert(parent[i]);
}
while (q--) {
int b, c, d; scanf("%d %d %d", &b, &c, &d);
switch (d)
{
case 0:
puts(treeidx[b] == treeidx[c] ? "YES" : "NO"); break;
case 1:
if (treeidx[b] == treeidx[c])
{
puts("YES"); cut(b);
}
else
{
puts("NO"); cut(c);
}
}
}
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |