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

#include <bits/stdc++.h>
using namespace std;
// Optimisations
#pragma GCC target("avx2")
#pragma GCC optimization("unroll-loops")
#pragma GCC optimize("O2")
// shortcuts for functions
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define all(v) v.begin(), v.end()
#define prec(n) fixed << setprecision(n)
#define n_l '\\n'
// make it python
#define gcd __gcd
#define append push_back
#define str to_string
// utility functions shortcuts
#define max3(a, b, c) max(a, max(b, c))
#define min3(a, b, c) min(a, min(b, c))
#define sswap(a, b)                                                            \\
  {                                                                            \\
    a = a ^ b;                                                                 \\
    b = a ^ b;                                                                 \\
    a = a ^ b;                                                                 \\
  }
#define swap(a, b)                                                             \\
  {                                                                            \\
    auto temp = a;                                                             \\
    a = b;                                                                     \\
    b = temp;                                                                  \\
  }
#define init(dp) memset(dp, -1, sizeof(dp));
#define set0(dp) memset(dp, 0, sizeof(dp));
#define bits(x) __builtin_popcount(x)
#define SORT(v) sort(all(v))
#define endl "\\n"
#define forr(i, n) for (ll i = 0; i < n; i++)
// declaration shortcuts
typedef long long int ll;
#define int ll
// Constants
constexpr int dx[] = {-1, 0, 1, 0, 1, 1, -1, -1};
constexpr int dy[] = {0, -1, 0, 1, 1, -1, 1, -1};
constexpr ll INF = 1999999999999999997;
constexpr int inf = INT_MAX;
constexpr int MAXSIZE = int(1e6) + 5;
constexpr auto PI = 3.14159265358979323846L;
constexpr auto oo = numeric_limits<int>::max() / 2 - 2;
constexpr auto eps = 1e-6;
constexpr auto mod = 1000000007;
constexpr auto MOD = 1000000007;
constexpr auto MOD9 = 1000000009;
constexpr auto maxn = 100006;
// void IOfile(){
// freopen(file_name, reade_mode, stdin);
// freopen(file_name, write_mode, stdout);
// }
void fastio() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
}

vector<int> v[2 * maxn];
int ans[2 * maxn];
int val[2 * maxn];
int dropped[2 * maxn];
set<int> s;
void dfs(int st, int p) {

  auto t = s.lower_bound(val[st]);
  if (t == s.end())
    s.insert(val[st]);
  else {
    s.erase(*t);
    dropped[st] = *t;
    s.insert(val[st]);
  }

  ans[st] = s.size();
  for (auto i : v[st]) {
    if (i == p)
      continue;
    dfs(i, st);
  }
  s.erase(val[st]);
  if (dropped[st]) {
    s.insert(dropped[st]);
  }
}

int32_t main() {
  fastio();
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> val[i];
  }
  for (int i = 1; i <= n; i++) {
    int a, b;
    cin >> a >> b;
    v[a].push_back(b);
    v[b].push_back(a);
  }

  dfs(1, 0);
  for (int i = 1; i <= n; i++) {
    cout << ans[i] << "\\n";
  }
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
// Optimisations
#pragma GCC target("avx2")
#pragma GCC optimization("unroll-loops")
#pragma GCC optimize("O2")
// shortcuts for functions
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define all(v) v.begin(), v.end()
#define prec(n) fixed << setprecision(n)
#define n_l '\\n'
// make it python
#define gcd __gcd
#define append push_back
#define str to_string
// utility functions shortcuts
#define max3(a, b, c) max(a, max(b, c))
#define min3(a, b, c) min(a, min(b, c))
#define sswap(a, b)                                                            \\
  {                                                                            \\
    a = a ^ b;                                                                 \\
    b = a ^ b;                                                                 \\
    a = a ^ b;                                                                 \\
  }
#define swap(a, b)                                                             \\
  {                                                                            \\
    auto temp = a;                                                             \\
    a = b;                                                                     \\
    b = temp;                                                                  \\
  }
#define init(dp) memset(dp, -1, sizeof(dp));
#define set0(dp) memset(dp, 0, sizeof(dp));
#define bits(x) __builtin_popcount(x)
#define SORT(v) sort(all(v))
#define endl "\\n"
#define forr(i, n) for (ll i = 0; i < n; i++)
// declaration shortcuts
typedef long long int ll;
#define int ll
// Constants
constexpr int dx[] = {-1, 0, 1, 0, 1, 1, -1, -1};
constexpr int dy[] = {0, -1, 0, 1, 1, -1, 1, -1};
constexpr ll INF = 1999999999999999997;
constexpr int inf = INT_MAX;
constexpr int MAXSIZE = int(1e6) + 5;
constexpr auto PI = 3.14159265358979323846L;
constexpr auto oo = numeric_limits<int>::max() / 2 - 2;
constexpr auto eps = 1e-6;
constexpr auto mod = 1000000007;
constexpr auto MOD = 1000000007;
constexpr auto MOD9 = 1000000009;
constexpr auto maxn = 100006;
// void IOfile(){
// freopen(file_name, reade_mode, stdin);
// freopen(file_name, write_mode, stdout);
// }
void fastio() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
}

vector<int> v[2 * maxn];
int ans[2 * maxn];
int val[2 * maxn];

void dfs(int st, int p, vector<int> a) {
  vector<int> b = a;
  auto t = lower_bound(all(b), val[st]);
  if (t == b.end()) {
    b.push_back(val[st]);
  } else
    *t = val[st];
  ans[st] = b.size();
  for (auto i : v[st]) {
    if (i == p)
      continue;
    dfs(i, st, b);
  }
}

int32_t main() {
  fastio();
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> val[i];
  }
  for (int i = 1; i <= n; i++) {
    int a, b;
    cin >> a >> b;
    v[a].push_back(b);
    v[b].push_back(a);
  }

  vector<int> c;

  dfs(1, 0, c);
  for (int i = 1; i <= n; i++) {
    cout << ans[i] << "\\n";
  }
}