Problem p02698 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define P pair<int, int>
#define fi first
#define se second
#define rep(i, n) for (int i = 0; i < n; i++)
#define all(v) v.begin(), v.end()
#define pb push_back
template <class T> void chmax(T &a, T b) {
  if (a < b)
    a = b;
}
template <class T> void chmin(T &a, T b) {
  if (a > b)
    a = b;
}
constexpr int INF = 1000000000;
constexpr int mod = 1000000007;
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
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; }
bool prime(int a) {
  if (a == 1)
    return false;
  for (int i = 2; i * i <= a; i++) {
    if (a % i == 0)
      return false;
  }
  return true;
}
vector<int> kaijo;
void init_fact(int n) {
  kaijo.resize(n + 1);
  kaijo[0] = 1;
  for (int i = 1; i <= n; i++) {
    kaijo[i] = kaijo[i - 1] * i;
    kaijo[i] %= mod;
  }
}
int modpow(int a, int b) {
  if (b == 0)
    return 1;
  if (b % 2)
    return modpow(a, b - 1) * a % mod;
  int memo = modpow(a, b / 2);
  return memo * memo % mod;
}
int comb(int a, int b) {
  // if(!kaijo[0])init_fact(2000010);
  return kaijo[a] * modpow(kaijo[a - b], mod - 2) % mod *
         modpow(kaijo[b], mod - 2) % mod;
}
int inv(int x) {
  x = modpow(x, mod - 2);
  return x;
}
bool kosa(double ax, double ay, double bx, double by, double cx, double cy,
          double dx, double dy) {
  double ta = (cx - dx) * (ay - cy) + (cy - dy) * (cx - ax);
  double tb = (cx - dx) * (by - cy) + (cy - dy) * (cx - bx);
  double tc = (ax - bx) * (cy - ay) + (ay - by) * (ax - cx);
  double td = (ax - bx) * (dy - ay) + (ay - by) * (ax - dx);
  return tc * td < 0 && ta * tb < 0;
}
int n, a[200010];
int ans[200010];
vector<int> v[200010];
int dp[200010];
void dfs(int x) {
  ans[x] = lower_bound(dp, dp + n + 1, INF) - dp - 1;
  for (int i : v[x]) {
    if (ans[i] == 0) {
      int it = lower_bound(dp, dp + n + 1, a[i]) - dp;
      int num = dp[it];
      dp[it] = a[i];
      dfs(i);
      dp[it] = num;
    }
  }
}
int main() {
  cin >> n;
  rep(i, n) cin >> a[i];
  rep(i, n - 1) {
    int A, b;
    cin >> A >> b;
    A--, b--;
    v[A].pb(b);
    v[b].pb(A);
  }
  fill(dp, dp + n + 1, INF);
  dp[0] = 0, dp[1] = a[0];
  dfs(0);
  rep(i, n) cout << ans[i] << endl;
  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define P pair<int, int>
#define fi first
#define se second
#define rep(i, n) for (int i = 0; i < n; i++)
#define all(v) v.begin(), v.end()
#define pb push_back
template <class T> void chmax(T &a, T b) {
  if (a < b)
    a = b;
}
template <class T> void chmin(T &a, T b) {
  if (a > b)
    a = b;
}
constexpr int INF = 1000000000;
constexpr int mod = 1000000007;
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
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; }
bool prime(int a) {
  if (a == 1)
    return false;
  for (int i = 2; i * i <= a; i++) {
    if (a % i == 0)
      return false;
  }
  return true;
}
vector<int> kaijo;
void init_fact(int n) {
  kaijo.resize(n + 1);
  kaijo[0] = 1;
  for (int i = 1; i <= n; i++) {
    kaijo[i] = kaijo[i - 1] * i;
    kaijo[i] %= mod;
  }
}
int modpow(int a, int b) {
  if (b == 0)
    return 1;
  if (b % 2)
    return modpow(a, b - 1) * a % mod;
  int memo = modpow(a, b / 2);
  return memo * memo % mod;
}
int comb(int a, int b) {
  // if(!kaijo[0])init_fact(2000010);
  return kaijo[a] * modpow(kaijo[a - b], mod - 2) % mod *
         modpow(kaijo[b], mod - 2) % mod;
}
int inv(int x) {
  x = modpow(x, mod - 2);
  return x;
}
bool kosa(double ax, double ay, double bx, double by, double cx, double cy,
          double dx, double dy) {
  double ta = (cx - dx) * (ay - cy) + (cy - dy) * (cx - ax);
  double tb = (cx - dx) * (by - cy) + (cy - dy) * (cx - bx);
  double tc = (ax - bx) * (cy - ay) + (ay - by) * (ax - cx);
  double td = (ax - bx) * (dy - ay) + (ay - by) * (ax - dx);
  return tc * td < 0 && ta * tb < 0;
}
int n, a[200010];
int ans[200010];
vector<int> v[200010];
vector<int> dp[200010];
void dfs(int x) {
  ans[x] = dp[x].size() - 1;
  vector<int> u = dp[x];
  for (int i : v[x]) {
    if (ans[i] == 0) {
      if (u.back() < a[i]) {
        u.pb(a[i]);
        dp[i] = u;
        dfs(i);
        u.pop_back();
      } else {
        int y = lower_bound(all(u), a[i]) - u.begin();
        u[y] = a[i];
        dp[i] = u;
        dfs(i);
        u[y] = dp[x][y];
      }
    }
  }
}
int main() {
  cin >> n;
  rep(i, n) cin >> a[i];
  rep(i, n - 1) {
    int A, b;
    cin >> A >> b;
    A--, b--;
    v[A].pb(b);
    v[b].pb(A);
  }
  dp[0] = {0, a[0]};
  dfs(0);
  rep(i, n) cout << ans[i] << endl;
  return 0;
}