제출 #1359800

#제출 시각아이디문제언어결과실행 시간메모리
1359800ayazBirthday gift (IZhO18_treearray)C++20
56 / 100
9 ms1176 KiB
#include <bits/stdc++.h>

using namespace std;

#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif

#define all(x) (x).begin(), (x).end()
#define isz(x) (int)x.size()
#define int long long

const int block = 256, MAX = 2100, mod = 1e9 + 7, LOG = 30, INF = 1e18;

int tin[MAX], tout[MAX], par[MAX][LOG], timer = 0;
array<int, 2> a[MAX];
vector<int> g[MAX];

void dfs(int u, int p) {
  tin[u] = ++timer;
  par[u][0] = p;
  for (int d = 1; d < LOG; d++) {
    par[u][d] = par[par[u][d - 1]][d - 1];
  }
  for (auto &v : g[u]) {
    if (v == p) continue;
    dfs(v, u);
  }
  tout[u] = timer;
}
bool is_anc(int u, int v) {
  return tin[u] <= tin[v] && tin[v] <= tout[u];
}
int lca(int u, int v) {
  if (is_anc(u, v)) return u;
  if (is_anc(v, u)) return v;
  for (int d = LOG - 1; d >= 0; d--) {
    if (!is_anc(par[u][d], v)) {
      u = par[u][d];
    }
  }
  assert(par[u][0] != 0);
  return par[u][0];
}
void run(int tc) {
  int n, m, q; cin >> n >> m >> q;
  for (int i = 1; i < n; i++) {
    int u, v; cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  dfs(1, 1);
  for (int i = 1; i <= m; i++) {
    cin >> a[i][0];
    a[i][1] = tin[a[i][0]];
  }
  while(q--) {
    int ty; cin >> ty;
    if (ty == 1) {
      int pos, val; cin >> pos >> val;
      a[pos] = array<int, 2>{val, tin[val]};
    } else {
      int l, r, v; cin >> l >> r >> v;
      int last = -1, lc = -1;
      array<int, 2> ans{-1, -1};
      for (int i = l; i <= r; i++) {
        auto [u, t] = a[i];
        if (t > tout[v] || t < tin[v]) {
          if (lc == v) {
            ans = {last, i - 1};
            break;
          }
          lc = -1;
        } else {
          if (lc != -1) lc = lca(lc, u);
          else {
            lc = u;
            last = i;
          }  
          if (lc == v) {
            ans = {last, i};
            break;
          }
        }
      }
      cout << ans[0] << ' ' << ans[1] << '\n';
    }
  }
}
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int t = 1; // cin >> t;
  for (int tc = 1; tc <= t; tc++) run(tc);
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…