Problem p02698 (C++) — buggy submission, verdict: Runtime Error

#pragma GCC optimize("O3", "unroll-loops")
#pragma GCC target("sse4.2")

#include <algorithm>
#include <bitset>
#include <cassert>
#include <chrono>
#include <cmath>
#include <complex>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;

#define FAST                                                                   \\
  ios_base::sync_with_stdio(0);                                                \\
  cin.tie(0);                                                                  \\
  cout.tie(0)
#define FIXED cout << fixed << setprecision(12)
#define ll long long
#define ld long double
#define pii pair<int, int>
#define pll pair<ll, ll>
#define graph vector<vector<int>>
#define pb push_back
#define pf push_front
#define popb pop_back
#define popf pop_front
#define f first
#define s second
#define hashmap unordered_map
#define hashset unordered_set
#define eps 1e-9
#define mod 1000000007
#define inf 3000000000000000007ll
#define sz(a) signed(a.size())
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()

#ifdef DEBUG
mt19937 gen(857204);
#else
mt19937 gen(chrono::high_resolution_clock::now().time_since_epoch().count());
#endif

#ifdef DEBUG
template <class T> T to_dbg(T x) { return x; }
template <class T, class U> string to_dbg(pair<T, U> p) {
  stringstream ss;
  ss << '{' << p.f << ',' << p.s << '}';
  return ss.str();
}
string to_dbg(string s) { return "\\"" + s + "\\""; }
template <class T> string to_dbg(vector<T> a) {
  stringstream ss;
  ss << '{';
  if (sz(a))
    ss << to_dbg(a[0]);
  for (int i = 1; i < sz(a); ++i)
    ss << "," << to_dbg(a[i]);
  ss << '}';
  return ss.str();
}
template <class T> void dbgout(T x) { cout << to_dbg(x) << endl; }
template <class T, class... U> void dbgout(T t, U... u) {
  cout << to_dbg(t) << ", ";
  dbgout(u...);
}
#define dbg(...) cout << "[" << #__VA_ARGS__ << "] = ", dbgout(__VA_ARGS__);
#else
#define dbg(...) 0
#endif

template <class T, class U> inline void checkmin(T &x, U y) {
  if (y < x)
    x = y;
}
template <class T, class U> inline void checkmax(T &x, U y) {
  if (y > x)
    x = y;
}
template <class T, class U> inline bool ifmax(T &x, U y) {
  if (y > x)
    return x = y, true;
  return false;
}
template <class T, class U> inline bool ifmin(T &x, U y) {
  if (y < x)
    return x = y, true;
  return false;
}
template <class T> inline void sort(T &a) { sort(all(a)); }
template <class T> inline void rsort(T &a) { sort(rall(a)); }
template <class T> inline void reverse(T &a) { reverse(all(a)); }
template <class T, class U>
inline istream &operator>>(istream &str, pair<T, U> &p) {
  return str >> p.f >> p.s;
}
template <class T> inline istream &operator>>(istream &str, vector<T> &a) {
  for (auto &i : a)
    str >> i;
  return str;
}
template <class T> inline T sorted(T a) {
  sort(a);
  return a;
}

vector<int> a, asc, ans;
int ptr = 0;
graph G;

void recsolve(int v, int p = -1) {
  int ind = lower_bound(all(asc), a[v]) - asc.begin();
  int was = asc[ind];
  asc[ind] = a[v];
  while (asc[ptr] < mod)
    ++ptr;
  while (ptr > 0 && asc[ptr - 1] == mod)
    --ptr;
  ans[v] = ptr;
  for (auto i : G[v])
    if (i != p)
      recsolve(i, v);
  asc[ind] = was;
}

signed main() {
  FAST;
  FIXED;
  int n;
  cin >> n;
  a = vector<int>(n);
  cin >> a;
  G = graph(n);
  for (int i = 1; i < n; ++i) {
    int u, v;
    cin >> u >> v;
    --u, --v;
    G[u].pb(v);
    G[v].pb(u);
  }
  ans = vector<int>(n);
  asc = vector<int>(n + 1, mod);
  recsolve(0);
  for (auto i : ans)
    cout << i << '\\n';
#ifdef DEBUG
  cerr << "Runtime is: " << clock() * 1.0 / CLOCKS_PER_SEC << endl;
#endif
  return 0;
}

Error: 0

Fixed submission:

#pragma GCC optimize("O3", "unroll-loops")
#pragma GCC target("sse4.2")

#include <algorithm>
#include <bitset>
#include <cassert>
#include <chrono>
#include <cmath>
#include <complex>
#include <deque>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;

#define FAST                                                                   \\
  ios_base::sync_with_stdio(0);                                                \\
  cin.tie(0);                                                                  \\
  cout.tie(0)
#define FIXED cout << fixed << setprecision(12)
#define ll long long
#define ld long double
#define pii pair<int, int>
#define pll pair<ll, ll>
#define graph vector<vector<int>>
#define pb push_back
#define pf push_front
#define popb pop_back
#define popf pop_front
#define f first
#define s second
#define hashmap unordered_map
#define hashset unordered_set
#define eps 1e-9
#define mod 1000000007
#define inf 3000000000000000007ll
#define sz(a) signed(a.size())
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()

#ifdef DEBUG
mt19937 gen(857204);
#else
mt19937 gen(chrono::high_resolution_clock::now().time_since_epoch().count());
#endif

#ifdef DEBUG
template <class T> T to_dbg(T x) { return x; }
template <class T, class U> string to_dbg(pair<T, U> p) {
  stringstream ss;
  ss << '{' << p.f << ',' << p.s << '}';
  return ss.str();
}
string to_dbg(string s) { return "\\"" + s + "\\""; }
template <class T> string to_dbg(vector<T> a) {
  stringstream ss;
  ss << '{';
  if (sz(a))
    ss << to_dbg(a[0]);
  for (int i = 1; i < sz(a); ++i)
    ss << "," << to_dbg(a[i]);
  ss << '}';
  return ss.str();
}
template <class T> void dbgout(T x) { cout << to_dbg(x) << endl; }
template <class T, class... U> void dbgout(T t, U... u) {
  cout << to_dbg(t) << ", ";
  dbgout(u...);
}
#define dbg(...) cout << "[" << #__VA_ARGS__ << "] = ", dbgout(__VA_ARGS__);
#else
#define dbg(...) 0
#endif

template <class T, class U> inline void checkmin(T &x, U y) {
  if (y < x)
    x = y;
}
template <class T, class U> inline void checkmax(T &x, U y) {
  if (y > x)
    x = y;
}
template <class T, class U> inline bool ifmax(T &x, U y) {
  if (y > x)
    return x = y, true;
  return false;
}
template <class T, class U> inline bool ifmin(T &x, U y) {
  if (y < x)
    return x = y, true;
  return false;
}
template <class T> inline void sort(T &a) { sort(all(a)); }
template <class T> inline void rsort(T &a) { sort(rall(a)); }
template <class T> inline void reverse(T &a) { reverse(all(a)); }
template <class T, class U>
inline istream &operator>>(istream &str, pair<T, U> &p) {
  return str >> p.f >> p.s;
}
template <class T> inline istream &operator>>(istream &str, vector<T> &a) {
  for (auto &i : a)
    str >> i;
  return str;
}
template <class T> inline T sorted(T a) {
  sort(a);
  return a;
}

vector<int> a, asc, ans;
int ptr = 0;
graph G;

void recsolve(int v, int p = -1) {
  int ind = upper_bound(all(asc), a[v]) - asc.begin();
  int was = asc[ind];
  asc[ind] = a[v];
  while (asc[ptr] < mod)
    ++ptr;
  while (ptr > 0 && asc[ptr - 1] == mod)
    --ptr;
  ans[v] = ptr;
  for (auto i : G[v])
    if (i != p)
      recsolve(i, v);
  asc[ind] = was;
}

signed main() {
  FAST;
  FIXED;
  int n;
  cin >> n;
  a = vector<int>(n);
  cin >> a;
  G = graph(n);
  for (int i = 1; i < n; ++i) {
    int u, v;
    cin >> u >> v;
    --u, --v;
    G[u].pb(v);
    G[v].pb(u);
  }
  asc = ans = vector<int>(n, mod);
  recsolve(0);
  for (auto i : ans)
    cout << i << '\\n';
#ifdef DEBUG
  cerr << "Runtime is: " << clock() * 1.0 / CLOCKS_PER_SEC << endl;
#endif
  return 0;
}