Submission details
Task:Company Queries II
Sender:ind1f
Submission time:2025-10-09 19:40:54 +0300
Language:C++ (C++17)
Status:COMPILE ERROR

Compiler report

input/code.cpp: In function 'void build_lca()':
input/code.cpp:33:28: error: expected primary-expression before '{' token
   33 |       sp[j][i] = (j == 0 ? {lv[et[i]], et[i]} : min(sp[j - 1][i], sp[j - 1][i + (1 << (j - 1))]));
      |                            ^
input/code.cpp:33:27: error: expected ':' before '{' token
   33 |       sp[j][i] = (j == 0 ? {lv[et[i]], et[i]} : min(sp[j - 1][i], sp[j - 1][i + (1 << (j - 1))]));
      |                           ^~
      |                           :
input/code.cpp:33:28: error: expected primary-expression before '{' token
   33 |       sp[j][i] = (j == 0 ? {lv[et[i]], et[i]} : min(sp[j - 1][i], sp[j - 1][i + (1 << (j - 1))]));
      |                            ^
input/code.cpp:33:27: error: expected ')' before '{' token
   33 |       sp[j][i] = (j == 0 ? {lv[et[i]], et[i]} : min(sp[j - 1][i], sp[j - 1][i + (1 << (j - 1))]));
      |                  ~        ^~
      |                           )

Code

#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 5;
const int L = 20;

int n, q;
vector<int> g[N];
int fst[N], et[2 * N];
int lv[N];
int lg2[2 * N];
pair<int, int> sp[L][2 * N];
int time_euler;

void dfs(int u) {
  fst[u] = ++time_euler;
  et[time_euler] = u;
  for (int v : g[u]) {
    lv[v] = lv[u] + 1;
    dfs(v);
    et[++time_euler] = u;
  }
}

void build_lca() {
  lg2[1] = 0;
  for (int i = 2; i < 2 * N; i++) {
    lg2[i] = lg2[i / 2] + 1;
  }
  for (int j = 0; j < L; j++) {
    for (int i = 1; i + (1 << j) - 1 <= time_euler; i++) {
      sp[j][i] = (j == 0 ? {lv[et[i]], et[i]} : min(sp[j - 1][i], sp[j - 1][i + (1 << (j - 1))]));
    }
  }
}

int lca(int u, int v) {
  if (fst[u] > fst[v]) {
    swap(u, v);
  }
  int w = lg2[fst[v] - fst[u] + 1];
  return min(sp[w][fst[u]], sp[w][fst[v] - (1 << w) + 1]).second;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> q;
  for (int i = 2; i <= n; i++) {
    int e;
    cin >> e;
    g[e].emplace_back(i);
  }
  dfs(1);
  build_lca();
  while (q--) {
    int a, b;
    cin >> a >> b;
    cout << lca(a, b) << '\n';
  }
  return 0;
}