Problem p02698 (C++) — buggy submission, verdict: Runtime Error

// ヘッダー
#include <bits/stdc++.h>
using namespace std;

// 型定義
typedef long long ll;

// 定数
const ll INF = 1e+18;
const int MOD = 1e+9 + 7;

// REPマクロ
#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define REPD(i, n) for (ll i = n - 1; i >= 0; i--)
#define REP2(i, a, b) for (ll i = a; i < (ll)(b); i++)
#define REPD2(i, a, b) for (ll i = a; i > (ll)(b); i--)

// 多次元 vector 生成
template <class T> vector<T> make_vec(size_t a) { return vector<T>(a); }
template <class T, class... Ts> auto make_vec(size_t a, Ts... ts) {
  return vector<decltype(make_vec<T>(ts...))>(a, make_vec<T>(ts...));
}

// vectorの扱い
#define ALL(x) (x).begin(), (x).end() // sortなどの引数省略
#define SIZE(x) ((ll)(x).size())      // size
#define MAX(x) *max_element(ALL(x))   // 最大値
#define MIN(x) *min_element(ALL(x))   // 最小値

// グローバルに持っていく
//  深さ優先探索
using Graph = vector<vector<ll>>;
vector<bool> seen;
vector<ll> a;
vector<ll> dp; // dp

stack<pair<ll, ll>> sta;
vector<ll> ans;
void dfs(const Graph &G, int v) {
  seen[v] = true; // v を訪問済にする
  ll idx = lower_bound(dp.begin(), dp.end(), a[v]) - dp.begin();
  ll tmp = dp[idx];
  dp[idx] = a[v];

  // v から行ける各頂点 next_v について
  for (auto next_v : G[v]) {
    if (seen[next_v])
      continue;     // next_v が探索済だったらスルー
    dfs(G, next_v); // 再帰的に探索
  }
  ans[v] = lower_bound(dp.begin(), dp.end(), INF) - dp.begin();
  dp[idx] = tmp;
}

int main() {
  ll N;
  cin >> N;
  Graph G(N);
  a.assign(N, 0);
  REP(i, N) cin >> a[i];
  REP(i, N - 1) {
    ll u, v;
    cin >> u >> v;
    u--;
    v--;
    G[u].push_back(v);
    G[v].push_back(u);
  }

  // 頂点0スタート
  seen.assign(N, false); // 全頂点を「未訪問」に初期化
  dp.assign(N + 1, INF);
  ans.assign(N + 1, 1);
  dfs(G, 0);
  REP(i, N) { cout << ans[i] << endl; }
}


Error: 0

Fixed submission:

// ヘッダー
#include <bits/stdc++.h>
using namespace std;

// 型定義
typedef long long ll;

// 定数
const ll INF = 1e+18;
const int MOD = 1e+9 + 7;

// REPマクロ
#define REP(i, n) for (ll i = 0; i < (ll)(n); i++)
#define REPD(i, n) for (ll i = n - 1; i >= 0; i--)
#define REP2(i, a, b) for (ll i = a; i < (ll)(b); i++)
#define REPD2(i, a, b) for (ll i = a; i > (ll)(b); i--)

// 多次元 vector 生成
template <class T> vector<T> make_vec(size_t a) { return vector<T>(a); }
template <class T, class... Ts> auto make_vec(size_t a, Ts... ts) {
  return vector<decltype(make_vec<T>(ts...))>(a, make_vec<T>(ts...));
}

// vectorの扱い
#define ALL(x) (x).begin(), (x).end() // sortなどの引数省略
#define SIZE(x) ((ll)(x).size())      // size
#define MAX(x) *max_element(ALL(x))   // 最大値
#define MIN(x) *min_element(ALL(x))   // 最小値

// グローバルに持っていく
//  深さ優先探索
using Graph = vector<vector<ll>>;
vector<bool> seen;
vector<ll> a(20100);
vector<ll> dp; // dp

vector<ll> ans(20100);
void dfs(const Graph &G, int v) {
  seen[v] = true; // v を訪問済にする
  ll tmp = *lower_bound(dp.begin(), dp.end(), a[v]);
  *lower_bound(dp.begin(), dp.end(), a[v]) = a[v];
  // v から行ける各頂点 next_v について
  for (auto next_v : G[v]) {
    if (seen[next_v])
      continue;     // next_v が探索済だったらスルー
    dfs(G, next_v); // 再帰的に探索
  }
  ans[v] = lower_bound(dp.begin(), dp.end(), INF) - dp.begin();
  *lower_bound(dp.begin(), dp.end(), a[v]) = tmp;
}

int main() {
  ll N;
  cin >> N;
  Graph G(N);
  REP(i, N) cin >> a[i];
  REP(i, N - 1) {
    ll u, v;
    cin >> u >> v;
    u--;
    v--;
    G[u].push_back(v);
  }

  // 頂点0スタート
  seen.assign(N, false); // 全頂点を「未訪問」に初期化
  dp.assign(N + 1, INF);
  dfs(G, 0);
  REP(i, N) { cout << ans[i] << endl; }
}