이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
using namespace std;
const long long mod = (long long)1e9+7;
const int N = 200200;
int n, m, q, a[N], d[N], up[20][N];
vector<int> g[N];
void dfs(int v, int pr) {
up[0][v] = pr;
for(int i = 1; i < 19; i++){
up[i][v] = up[i-1][up[i-1][v]];
}
d[v] = d[pr] + 1;
for(int to : g[v]) {
if(to == pr) continue;
dfs(to, v);
}
}
int lca(int u, int v) {
if(d[u] < d[v]) {
int temp = u;
u = v;
v = temp;
}
for(int i = 18; i >= 0; i--){
if(d[u] - (1<<i) >= d[v]) {
u = up[i][u];
}
}
if(u == v) return u;
for(int i = 18; i >= 0; i--){
if(up[i][u] != up[i][v]) {
u = up[i][u];
v = up[i][v];
}
}
return up[0][v];
}
int main() {
ios_base :: sync_with_stdio(false);
cin.tie(NULL);
srand(time(NULL));
cin>>n>>m>>q;
for (int i = 1; i<n; i++) {
int x, y;
cin>>x>>y;
g[x].pb(y); g[y].pb(x);
}
for (int i = 1; i<=m; i++) {
cin>>a[i];
}
dfs(1, 1);
while (q--) {
int t;
cin>>t;
if (t == 1) {
int pos, v;
cin>>pos>>v;
a[pos] = v;
} else {
int l, r, v;
cin>>l>>r>>v;
int curr = 0;
bool flag = false;
for (int x = l; x <= r; x++) {
for (int y = x; y <= r; y++) {
if (y == x) curr = a[y];
else curr = lca(curr, a[y]);
if (curr == v) {
cout<<x<<' '<<y<<'\n';
flag = true;
break;
}
// if (!isPar(v, curr)) break;
}
if (flag) break;
}
if (!flag)
cout<<"-1 -1\n";
}
}
return 0;
}
# | 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... |