Problem p02698 (C++)

Buggy submission (status: Runtime Error):
// g++ -std=c++11 a.cpp
#include <algorithm>
#include <assert.h>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <typeinfo>
#include <unordered_map>
#include <utility>
#include <vector>
#define loop(i, a, b) for (long long i = a; i < b; i++)
#define rep(i, a) loop(i, 0, a)
#define FOR(i, a) for (auto i : a)
#define pb push_back
#define all(in) in.begin(), in.end()
#define shosu(x) fixed << setprecision(x)
#define show1d(v)                                                              \
  {                                                                            \
    rep(_, v.size()) cout << " " << v[_];                                      \
    cout << endl;                                                              \
  }
#define show2d(v)                                                              \
  { rep(__, v.size()) show1d(v[__]); }
using namespace std;
// kaewasuretyuui
typedef long long ll;
#define int ll
typedef int Def;
typedef pair<Def, Def> pii;
typedef vector<Def> vi;
typedef vector<vi> vvi;
typedef vector<pii> vp;
typedef vector<vp> vvp;
typedef vector<string> vs;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef pair<Def, pii> pip;
typedef vector<pip> vip;
#define mt make_tuple
typedef tuple<int, int, int> tp;
typedef vector<tp> vt;
template <typename A, typename B> bool cmin(A &a, const B &b) {
  return a > b ? (a = b, true) : false;
}
template <typename A, typename B> bool cmax(A &a, const B &b) {
  return a < b ? (a = b, true) : false;
}
const double PI = acos(-1);
const double EPS = 1e-9;
Def inf = sizeof(Def) == sizeof(long long) ? 2e18 : 1e9 + 10;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
#define yes cout << "Yes\n"
#define no cout << "No\n"

// nCr mod m
#define MOD 998244353
#define M 2200000
vector<ll> fact;
bool h = false;
void init() {
  h = true;
  fact = vector<ll>(M);
  fact[0] = fact[1] = 1;
  loop(i, 2, M) fact[i] = fact[i - 1] * i % MOD;
}
// a^b mod MOD
ll powmod(ll a, ll b, ll m = MOD) {
  ll out = 1;
  ll p = a % m;
  while (b) {
    if (b & 1)
      out = out * p % m;
    p = p * p % m;
    b >>= 1;
  }
  return out;
}
// nCr
ll nCr(ll n, ll r, ll m = MOD) {
  if (!h)
    init();
  if (n < 0 || r < 0 || n < r)
    return 1; //??????
  ll out = fact[n] * powmod(fact[r] * fact[n - r] % m, m - 2, m) % m;
  return out;
}
int gcd(int a, int b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}
int lcm(int a, int b) { return a / gcd(a, b) * b; }

int LIS(vi in) { // Longest Increasing Subsequence
  int n = in.size();
  vi out(n + 1, inf);
  rep(i, n) { *lower_bound(all(out), in[i]) = in[i]; }
  return lower_bound(all(out), inf) - out.begin();
}
int n;
vi in, out;
vvi G;
vi lis;
void dfs(int a, int p) {
  int prei = lower_bound(all(lis), in[a]) - lis.begin();
  int pre = lis[prei];
  lis[prei] = in[a];
  int t = lower_bound(all(lis), inf) - lis.begin();
  out[a] = t;
  rep(i, G[a].size()) {
    int to = G[a][i];
    if (p == to)
      continue;
    dfs(to, a);
  }
  lis[prei] = pre;
}
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);

  cin >> n;
  in = out = vi(n);
  rep(i, n) cin >> in[i];
  G = vvi(n);
  G[n].pb(0);
  rep(i, n - 1) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    G[a].pb(b);
    G[b].pb(a);
  }
  lis = vi(n + 1, inf);
  dfs(0, -1);
  rep(i, n) cout << out[i] << endl;
}


Fixed submission:
// g++ -std=c++11 a.cpp
#include <algorithm>
#include <assert.h>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <typeinfo>
#include <unordered_map>
#include <utility>
#include <vector>
#define loop(i, a, b) for (long long i = a; i < b; i++)
#define rep(i, a) loop(i, 0, a)
#define FOR(i, a) for (auto i : a)
#define pb push_back
#define all(in) in.begin(), in.end()
#define shosu(x) fixed << setprecision(x)
#define show1d(v)                                                              \
  {                                                                            \
    rep(_, v.size()) cout << " " << v[_];                                      \
    cout << endl;                                                              \
  }
#define show2d(v)                                                              \
  { rep(__, v.size()) show1d(v[__]); }
using namespace std;
// kaewasuretyuui
typedef long long ll;
#define int ll
typedef int Def;
typedef pair<Def, Def> pii;
typedef vector<Def> vi;
typedef vector<vi> vvi;
typedef vector<pii> vp;
typedef vector<vp> vvp;
typedef vector<string> vs;
typedef vector<double> vd;
typedef vector<vd> vvd;
typedef pair<Def, pii> pip;
typedef vector<pip> vip;
#define mt make_tuple
typedef tuple<int, int, int> tp;
typedef vector<tp> vt;
template <typename A, typename B> bool cmin(A &a, const B &b) {
  return a > b ? (a = b, true) : false;
}
template <typename A, typename B> bool cmax(A &a, const B &b) {
  return a < b ? (a = b, true) : false;
}
const double PI = acos(-1);
const double EPS = 1e-9;
Def inf = sizeof(Def) == sizeof(long long) ? 2e18 : 1e9 + 10;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
#define yes cout << "Yes\n"
#define no cout << "No\n"

// nCr mod m
#define MOD 998244353
#define M 2200000
vector<ll> fact;
bool h = false;
void init() {
  h = true;
  fact = vector<ll>(M);
  fact[0] = fact[1] = 1;
  loop(i, 2, M) fact[i] = fact[i - 1] * i % MOD;
}
// a^b mod MOD
ll powmod(ll a, ll b, ll m = MOD) {
  ll out = 1;
  ll p = a % m;
  while (b) {
    if (b & 1)
      out = out * p % m;
    p = p * p % m;
    b >>= 1;
  }
  return out;
}
// nCr
ll nCr(ll n, ll r, ll m = MOD) {
  if (!h)
    init();
  if (n < 0 || r < 0 || n < r)
    return 1; //??????
  ll out = fact[n] * powmod(fact[r] * fact[n - r] % m, m - 2, m) % m;
  return out;
}
int gcd(int a, int b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}
int lcm(int a, int b) { return a / gcd(a, b) * b; }

int LIS(vi in) { // Longest Increasing Subsequence
  int n = in.size();
  vi out(n + 1, inf);
  rep(i, n) { *lower_bound(all(out), in[i]) = in[i]; }
  return lower_bound(all(out), inf) - out.begin();
}
int n;
vi in, out;
vvi G;
vi lis;
void dfs(int a, int p) {
  int prei = lower_bound(all(lis), in[a]) - lis.begin();
  int pre = lis[prei];
  lis[prei] = in[a];
  int t = lower_bound(all(lis), inf) - lis.begin();
  out[a] = t;
  rep(i, G[a].size()) {
    int to = G[a][i];
    if (p == to)
      continue;
    dfs(to, a);
  }
  lis[prei] = pre;
}
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);

  cin >> n;
  in = out = vi(n);
  rep(i, n) cin >> in[i];
  G = vvi(n);
  rep(i, n - 1) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    G[a].pb(b);
    G[b].pb(a);
  }
  lis = vi(n + 1, inf);
  dfs(0, -1);
  rep(i, n) cout << out[i] << endl;
}