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

#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using ll = long long;
using uint = unsigned int;
using graph = std::vector<std::vector<ll>>;
using wGraph = std::vector<std::vector<std::pair<ll, ll>>>;
#define rep(i, n) for (int i = 0; i < int(n); i++)

using namespace std;
ll MOD7 = 1000000007;
ll MOD9 = 1000000009;
vector<ll> InputVec(ll N) {
  vector<ll> A(N);
  for (int i = 0; i < N; ++i) {
    cin >> A[i];
  }
  return A;
}
void OutputVec(vector<ll> A) {
  for (int i = 0; i < A.size(); ++i) {
    cout << A[i] << ",";
  }
  cout << endl;
}
vector<vector<ll>> InputVec2d(ll H, ll W) {
  vector<vector<ll>> A(H);
  for (int yi = 0; yi < H; ++yi) {
    A[yi] = vector<ll>(W);
  }
  for (int yi = 0; yi < H; ++yi) {
    for (int xi = 0; xi < W; ++xi) {
      cin >> A[yi][xi];
    }
  }
  return A;
}
vector<vector<char>> InputVec2dStr(ll H, ll W) {
  vector<vector<char>> A(H);
  for (int yi = 0; yi < H; ++yi) {
    A[yi] = vector<char>(W);
  }
  for (int yi = 0; yi < H; ++yi) {
    string S;
    cin >> S;
    for (int xi = 0; xi < W; ++xi) {
      A[yi][xi] = S[xi];
    }
  }
  return A;
}
void OutputVec2d(vector<vector<ll>> A) {
  for (int yi = 0; yi < A.size(); ++yi) {
    for (int xi = 0; xi < A[yi].size(); ++xi) {
      cout << A[yi][xi] << ",";
    }
    cout << endl;
  }
}
graph InputGraph(ll N, ll M) {
  graph G(N);
  for (int i = 0; i < M; ++i) {
    ll a, b;
    cin >> a >> b;
    a--;
    b--;
    G[a].push_back(b);
    G[b].push_back(a);
  }
  return G;
}
graph InputDGraph(ll N, ll M) {
  graph G(N);
  for (int i = 0; i < M; ++i) {
    ll a, b;
    cin >> a >> b;
    a--;
    b--;
    G[a].push_back(b);
  }
  return G;
}
wGraph InputWGraph(ll N, ll M) {
  wGraph G(N);
  for (int i = 0; i < M; ++i) {
    ll a, b, c;
    cin >> a >> b >> c;
    a--;
    b--;
    G[a].push_back(make_pair(b, c));
    G[b].push_back(make_pair(a, c));
  }
  return G;
}
wGraph InputDWGraph(ll N, ll M) {
  wGraph G(N);
  for (int i = 0; i < M; ++i) {
    ll a, b, c;
    cin >> a >> b >> c;
    a--;
    b--;
    G[a].push_back(make_pair(b, c));
  }
  return G;
}
void OutputGraph(graph G) {
  for (int i = 0; i < G.size(); ++i) {
    cout << i << ":";
    for (int j = 0; j < G[i].size(); ++j) {
      cout << G[i][j] << ",";
    }
    cout << endl;
  }
}

void OutputGraph(wGraph G) {
  for (int i = 0; i < G.size(); ++i) {
    cout << i << ":";
    for (int j = 0; j < G[i].size(); ++j) {
      cout << G[i][j].first << "/" << G[i][j].second << ",";
    }
    cout << endl;
  }
}

void OutputAnswerBool(bool b, bool isUpperCase = false) {
  if (b) {
    if (isUpperCase) {
      cout << "YES" << endl;
    } else {
      cout << "Yes" << endl;
    }
  } else {
    if (isUpperCase) {
      cout << "NO" << endl;
    } else {
      cout << "No" << endl;
    }
  }
}
vector<ll> memo(200005);
vector<bool> seen(200005);
vector<ll> res(200005);
vector<ll> a;

void init(ll N) {
  for (int i = 0; i < 200005; ++i) {
    memo[i] = 1ll << 50;
    seen[i] = false;
  }
}
void solve(ll i, graph &G, ll N, ll r) {
  seen[i] = true;
  auto beforeIndex = lower_bound(memo.begin(), memo.end(), a[i]) - memo.begin();
  ll beforeVal = memo[beforeIndex];
  memo[beforeIndex] = a[i];
  ll count = 0;
  for (int j = r; j < N; ++j) {
    if (memo[j] == (1ll << 50)) {
      break;
    }
    r++;
  }
  // OutputVec(memo);
  res[i] = r;
  for (int j = 0; j < G[i].size(); ++j) {
    if (seen[G[i][j]]) {
      continue;
    }
    solve(G[i][j], G, N, r);
  }
  memo[beforeIndex] = beforeVal;
}
int main() {
  ll N;
  cin >> N;
  a = InputVec(N);
  // memo = vector<ll>(N);
  // seen = vector<bool>(N);
  init(N);
  graph G = InputGraph(N, N - 1);
  solve(0, G, N, 0);
  for (int i = 0; i < N; ++i) {
    cout << res[i] << endl;
  }
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using ll = long long;
using uint = unsigned int;
using graph = std::vector<std::vector<ll>>;
using wGraph = std::vector<std::vector<std::pair<ll, ll>>>;
#define rep(i, n) for (int i = 0; i < int(n); i++)

using namespace std;
ll MOD7 = 1000000007;
ll MOD9 = 1000000009;
vector<ll> InputVec(ll N) {
  vector<ll> A(N);
  for (int i = 0; i < N; ++i) {
    cin >> A[i];
  }
  return A;
}
void OutputVec(vector<ll> A) {
  for (int i = 0; i < A.size(); ++i) {
    cout << A[i] << ",";
  }
  cout << endl;
}
vector<vector<ll>> InputVec2d(ll H, ll W) {
  vector<vector<ll>> A(H);
  for (int yi = 0; yi < H; ++yi) {
    A[yi] = vector<ll>(W);
  }
  for (int yi = 0; yi < H; ++yi) {
    for (int xi = 0; xi < W; ++xi) {
      cin >> A[yi][xi];
    }
  }
  return A;
}
vector<vector<char>> InputVec2dStr(ll H, ll W) {
  vector<vector<char>> A(H);
  for (int yi = 0; yi < H; ++yi) {
    A[yi] = vector<char>(W);
  }
  for (int yi = 0; yi < H; ++yi) {
    string S;
    cin >> S;
    for (int xi = 0; xi < W; ++xi) {
      A[yi][xi] = S[xi];
    }
  }
  return A;
}
void OutputVec2d(vector<vector<ll>> A) {
  for (int yi = 0; yi < A.size(); ++yi) {
    for (int xi = 0; xi < A[yi].size(); ++xi) {
      cout << A[yi][xi] << ",";
    }
    cout << endl;
  }
}
graph InputGraph(ll N, ll M) {
  graph G(N);
  for (int i = 0; i < M; ++i) {
    ll a, b;
    cin >> a >> b;
    a--;
    b--;
    G[a].push_back(b);
    G[b].push_back(a);
  }
  return G;
}
graph InputDGraph(ll N, ll M) {
  graph G(N);
  for (int i = 0; i < M; ++i) {
    ll a, b;
    cin >> a >> b;
    a--;
    b--;
    G[a].push_back(b);
  }
  return G;
}
wGraph InputWGraph(ll N, ll M) {
  wGraph G(N);
  for (int i = 0; i < M; ++i) {
    ll a, b, c;
    cin >> a >> b >> c;
    a--;
    b--;
    G[a].push_back(make_pair(b, c));
    G[b].push_back(make_pair(a, c));
  }
  return G;
}
wGraph InputDWGraph(ll N, ll M) {
  wGraph G(N);
  for (int i = 0; i < M; ++i) {
    ll a, b, c;
    cin >> a >> b >> c;
    a--;
    b--;
    G[a].push_back(make_pair(b, c));
  }
  return G;
}
void OutputGraph(graph G) {
  for (int i = 0; i < G.size(); ++i) {
    cout << i << ":";
    for (int j = 0; j < G[i].size(); ++j) {
      cout << G[i][j] << ",";
    }
    cout << endl;
  }
}

void OutputGraph(wGraph G) {
  for (int i = 0; i < G.size(); ++i) {
    cout << i << ":";
    for (int j = 0; j < G[i].size(); ++j) {
      cout << G[i][j].first << "/" << G[i][j].second << ",";
    }
    cout << endl;
  }
}

void OutputAnswerBool(bool b, bool isUpperCase = false) {
  if (b) {
    if (isUpperCase) {
      cout << "YES" << endl;
    } else {
      cout << "Yes" << endl;
    }
  } else {
    if (isUpperCase) {
      cout << "NO" << endl;
    } else {
      cout << "No" << endl;
    }
  }
}
vector<ll> memo(200005);
vector<bool> seen(200005);
vector<ll> res(200005);
vector<ll> a;

void init(ll N) {
  for (int i = 0; i < 200005; ++i) {
    memo[i] = 1ll << 50;
    seen[i] = false;
  }
}
void solve(ll i, graph &G, ll N) {
  seen[i] = true;
  auto beforeIndex = lower_bound(memo.begin(), memo.end(), a[i]) - memo.begin();
  ll beforeVal = memo[beforeIndex];
  memo[beforeIndex] = a[i];
  ll count = 0;
  for (int j = 0; j < N; ++j) {
    if (memo[j] == (1ll << 50)) {
      break;
    }
    count++;
  }
  // OutputVec(memo);
  res[i] = count;
  for (int j = 0; j < G[i].size(); ++j) {
    if (seen[G[i][j]]) {
      continue;
    }
    solve(G[i][j], G, N);
  }
  memo[beforeIndex] = beforeVal;
}
int main() {
  ll N;
  cin >> N;
  a = InputVec(N);
  // memo = vector<ll>(N);
  // seen = vector<bool>(N);
  init(N);
  graph G = InputGraph(N, N - 1);
  solve(0, G, N);
  for (int i = 0; i < N; ++i) {
    cout << res[i] << endl;
  }
}