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

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define FIO                                                                    \\
  ios_base::sync_with_stdio(false);                                            \\
  cin.tie(NULL);                                                               \\
  cout.tie(NULL);
#define PI 3.141592653589793238462643383279502884L
#define make_unique(vec)                                                       \\
  vec.resize(distance(vec.begin(), unique(vec.begin(), vec.end())))
#define Sort(vec) sort(vec.begin(), vec.end())
#define RSort(vec) sort(vec.rbegin(), vec.rend())
#define endl "\\n"
#define tr1(i) cout << i << endl;
#define tr2(i, j) cout << i << " " << j << endl;
#define tr3(i, j, k) cout << i << " " << j << " " << k << endl;
#define vvi vector<vector<int>>
#define vvl vector<vector<ll>>
#define all(st) st.begin(), st.end()
#define vpl vector<pair<ll, ll>>
#define vpi vector<pair<int, int>>
#define pi pair<int, int>
#define pl pair<ll, ll>
#define al vector<list<int>>
#define vs vector<string>
#define vb vector<bool>
#define vi vector<int>
#define vl vector<ll>
#define vc vector<char>
#define rep(i, l, r) for (int i = l; i < r; i++)
#define repit(st) for (auto it = st.begin(); it != st.end(); it++)
#define cs(ans)                                                                \\
  ;                                                                            \\
  cout << setprecision(6) << fixed << ans << endl;
#define ull unsigned long long int
#define eb emplace_back
#define pb push_back
#define ll long long int
#define minf -(1e18)
#define inf 1e18
#define f first
#define se second
#define mod 1000000007
using namespace std;
using namespace __gnu_pbds;
ll mi(ll n, ll m) {
  ll pw = n % m;
  ll ex = m - 2;
  ll ans = 1;
  while (ex) {
    if (ex & 1)
      ans = ans * pw % m;
    pw = pw * pw % m;
    ex >>= 1;
  }
  return ans % mod;
}
ll pw(ll a, ll n) {
  ll pw = a;
  ll ex = n;
  ll ans = 1;
  while (ex) {
    if (ex & 1)
      ans = ans * pw;
    pw = pw * pw;
    ex >>= 1;
  }
  return ans;
}
ll pwm(ll a, ll n) {
  ll pw = a % mod;
  ll ex = n;
  ll ans = 1;
  while (ex) {
    if (ex & 1)
      ans = ans * pw % mod;
    pw = pw * pw % mod;
    ex >>= 1;
  }
  return ans % mod;
}
template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (T &t : v)
    is >> t;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &v) {
  for (const T &t : v) {
    os << t << " ";
  }
  os << '\\n';
  return os;
}
template <typename T>
using ordered_set =
    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
// st.order_of_key(num)->number of elements < num
// st.find_by_order(i)->iterator of ith element in sorted order starting from
// zero
ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); }
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }
ll max(ll a, ll b) { return a > b ? a : b; }
ll min(ll a, ll b) { return a < b ? a : b; }
ll Abs(ll x) { return x > 0 ? x : (-x); }
ll Ceil(ll a, ll b) { return a / b + (a % b != 0); }
#define bs binary_search
#define lb lower_bound
#define ub upper_bound
#define mkp make_pair
// #define int long long int
// Binary_Search->dp->greedy
// auto check = [&](ll x){};
vl vec, ans;
vvi adj;
set<int> st;
void go(int i, int par) {
  int sz = st.size();
  if (st.lb(vec[i]) == st.end()) {
    st.insert(vec[i]);
    ans[i] = sz + 1;
    for (int nbs : adj[i]) {
      if (nbs != par) {
        go(nbs, i);
      }
    }
    st.erase(vec[i]);
  } else {
    ans[i] = sz;
    auto it = st.lb(vec[i]);
    int val = *it;
    st.erase(*it);
    st.insert(vec[i]);
    for (int nbs : adj[i]) {
      if (nbs != par) {
        go(nbs, i);
      }
    }
    st.erase(vec[i]);
    st.insert(val);
  }
}

void solve() {
  int n;
  cin >> n;
  vec = vector<ll>(n);
  cin >> vec;
  adj = vector<vector<int>>(n);
  for (int i = 0; i < n - 1; i++) {
    int x, y;
    cin >> x >> y;
    x--;
    y--;
    adj[x].pb(y);
    adj[y].pb(x);
  }
  ans = vector<ll>(n);
  go(0, -1);
  for (int i = 0; i < n; i++)
    cout << ans[i] << endl;
}
int32_t main() {
  int t = 1;
  // scanf("%d",&t);
  while (t--) {
    solve();
  }
  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define FIO                                                                    \\
  ios_base::sync_with_stdio(false);                                            \\
  cin.tie(NULL);                                                               \\
  cout.tie(NULL);
#define PI 3.141592653589793238462643383279502884L
#define make_unique(vec)                                                       \\
  vec.resize(distance(vec.begin(), unique(vec.begin(), vec.end())))
#define Sort(vec) sort(vec.begin(), vec.end())
#define RSort(vec) sort(vec.rbegin(), vec.rend())
#define endl "\\n"
#define tr1(i) cout << i << endl;
#define tr2(i, j) cout << i << " " << j << endl;
#define tr3(i, j, k) cout << i << " " << j << " " << k << endl;
#define vvi vector<vector<int>>
#define vvl vector<vector<ll>>
#define all(st) st.begin(), st.end()
#define vpl vector<pair<ll, ll>>
#define vpi vector<pair<int, int>>
#define pi pair<int, int>
#define pl pair<ll, ll>
#define al vector<list<int>>
#define vs vector<string>
#define vb vector<bool>
#define vi vector<int>
#define vl vector<ll>
#define vc vector<char>
#define rep(i, l, r) for (int i = l; i < r; i++)
#define repit(st) for (auto it = st.begin(); it != st.end(); it++)
#define cs(ans)                                                                \\
  ;                                                                            \\
  cout << setprecision(6) << fixed << ans << endl;
#define ull unsigned long long int
#define eb emplace_back
#define pb push_back
#define ll long long int
#define minf -(1e18)
#define inf 1e18
#define f first
#define se second
#define mod 1000000007
using namespace std;
using namespace __gnu_pbds;
ll mi(ll n, ll m) {
  ll pw = n % m;
  ll ex = m - 2;
  ll ans = 1;
  while (ex) {
    if (ex & 1)
      ans = ans * pw % m;
    pw = pw * pw % m;
    ex >>= 1;
  }
  return ans % mod;
}
ll pw(ll a, ll n) {
  ll pw = a;
  ll ex = n;
  ll ans = 1;
  while (ex) {
    if (ex & 1)
      ans = ans * pw;
    pw = pw * pw;
    ex >>= 1;
  }
  return ans;
}
ll pwm(ll a, ll n) {
  ll pw = a % mod;
  ll ex = n;
  ll ans = 1;
  while (ex) {
    if (ex & 1)
      ans = ans * pw % mod;
    pw = pw * pw % mod;
    ex >>= 1;
  }
  return ans % mod;
}
template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (T &t : v)
    is >> t;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &v) {
  for (const T &t : v) {
    os << t << " ";
  }
  os << '\\n';
  return os;
}
template <typename T>
using ordered_set =
    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
// st.order_of_key(num)->number of elements < num
// st.find_by_order(i)->iterator of ith element in sorted order starting from
// zero
ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); }
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }
ll max(ll a, ll b) { return a > b ? a : b; }
ll min(ll a, ll b) { return a < b ? a : b; }
ll Abs(ll x) { return x > 0 ? x : (-x); }
ll Ceil(ll a, ll b) { return a / b + (a % b != 0); }
#define bs binary_search
#define lb lower_bound
#define ub upper_bound
#define mkp make_pair
// #define int long long int
// Binary_Search->dp->greedy
// auto check = [&](ll x){};
void go(int i, int par, vl &ans, vi st, vl &vec, vvi &adj, int sz) {
  if (sz == 0 || st[sz - 1] < vec[i])
    st.pb(vec[i]), ans[i] = sz + 1, sz++;
  else {
    ans[i] = sz;
    int l = 0, r = sz - 1, ind;
    while (l <= r) {
      int mid = (l + r) >> 1;
      if (st[mid] >= vec[i]) {
        ind = mid;
        r = mid - 1;
      } else
        l = mid + 1;
    }
    st[ind] = vec[i];
  }
  for (int nbs : adj[i]) {
    if (nbs != par) {
      go(nbs, i, ans, st, vec, adj, sz);
    }
  }
}

void solve() {
  int n;
  cin >> n;
  vl vec(n);
  cin >> vec;
  vvi adj(n);
  for (int i = 0; i < n - 1; i++) {
    int x, y;
    cin >> x >> y;
    x--;
    y--;
    adj[x].pb(y);
    adj[y].pb(x);
  }
  vl ans(n);
  vector<int> st;
  go(0, -1, ans, st, vec, adj, 0);
  for (int i = 0; i < n; i++)
    cout << ans[i] << endl;
}
int32_t main() {
  int t = 1;
  // scanf("%d",&t);
  while (t--) {
    solve();
  }
  return 0;
}