Problem p02698 (C++)

Buggy submission (status: Runtime Error):
/*
读题不规范，爆零两行泪。
数据不清空，爆零两行泪。
多测不读完，爆零两行泪。
边界不特判，爆零两行泪。
贪心不证明，爆零两行泪。
D P 顺序错，爆零两行泪。
大小少等号，爆零两行泪。
变量不统一，爆零两行泪。
越界不判断，爆零两行泪。
调试不注释，爆零两行泪。
溢出不 l l，爆零两行泪。
*/
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
const int N = 200000;
int n;
int a[N + 1];
vector<int> nums;
void discrete() {
  sort(nums.begin(), nums.end());
  nums.resize(unique(nums.begin(), nums.end()) - nums.begin());
  for (int i = 1; i <= n; i++)
    a[i] = lower_bound(nums.begin(), nums.end(), a[i]) - nums.begin();
}
vector<int> nei[N + 1];
multiset<int> st[N];
struct segtree {
  struct node {
    int l, r, mx;
  } nd[N << 2];
#define l(p) nd[p].l
#define r(p) nd[p].r
#define mx(p) nd[p].mx
  void bld(int l = 0, int r = nums.size() - 1, int p = 1) {
    l(p) = l;
    r(p) = r;
    mx(p) = 0;
    if (l == r)
      return;
    int mid = l + r >> 1;
    bld(l, mid, p << 1);
    bld(mid + 1, r, p << 1 | 1);
  }
  void init() { bld(); }
  void sprup(int p) { mx(p) = max(mx(p << 1), mx(p << 1 | 1)); }
  void chg(int x, int v, int p = 1) {
    if (l(p) == r(p))
      return mx(p) = v, void();
    int mid = l(p) + r(p) >> 1;
    chg(x, v, p << 1 | (x > mid));
    sprup(p);
  }
  int _mx(int l, int r, int p = 1) {
    if (l > r)
      return 0;
    if (l <= l(p) && r >= r(p))
      return mx(p);
    int mid = l(p) + r(p) >> 1, res = 0;
    if (l <= mid)
      res = max(res, _mx(l, r, p << 1));
    if (r > mid)
      res = max(res, _mx(l, r, p << 1 | 1));
    return res;
  }
} segt;
int dp[N + 1], ans[N + 1];
void dfs(int x = 1, int fa = 0) {
  dp[x] = segt._mx(0, a[x] - 1) + 1;
  ans[x] = max(ans[fa], dp[x]);
  st[a[x]].insert(dp[x]);
  segt.chg(a[x], *--st[a[x]].end());
  for (int i = 0; i < nei[x].size(); i++) {
    int y = nei[x][i];
    if (y == fa)
      continue;
    dfs(y, x);
  }
  st[a[x]].erase(st[a[x]].find(dp[x]));
  segt.chg(a[x], *--st[a[x]].end());
}
int main() {
  cin >> n;
  for (int i = 1; i <= n; i++)
    cin >> a[i], nums.pb(a[i]);
  for (int i = 1; i < n; i++) {
    int x, y;
    cin >> x >> y;
    nei[x].pb(y);
    nei[y].pb(x);
  }
  for (int i = 0; i < nums.size(); i++)
    st[i].insert(0);
  segt.init();
  dfs();
  for (int i = 1; i <= n; i++)
    cout << ans[i] << "\n";
  return 0;
}
/*1
10
1 2 5 3 4 6 7 3 2 4
1 2
2 3
3 4
4 5
3 6
6 7
1 8
8 9
9 10
*/

Fixed submission:
/*
读题不规范，爆零两行泪。
数据不清空，爆零两行泪。
多测不读完，爆零两行泪。
边界不特判，爆零两行泪。
贪心不证明，爆零两行泪。
D P 顺序错，爆零两行泪。
大小少等号，爆零两行泪。
变量不统一，爆零两行泪。
越界不判断，爆零两行泪。
调试不注释，爆零两行泪。
溢出不 l l，爆零两行泪。
*/
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
const int N = 200000;
int n;
int a[N + 1];
vector<int> nums;
void discrete() {
  sort(nums.begin(), nums.end());
  nums.resize(unique(nums.begin(), nums.end()) - nums.begin());
  for (int i = 1; i <= n; i++)
    a[i] = lower_bound(nums.begin(), nums.end(), a[i]) - nums.begin();
}
vector<int> nei[N + 1];
multiset<int> st[N];
struct segtree {
  struct node {
    int l, r, mx;
  } nd[N << 2];
#define l(p) nd[p].l
#define r(p) nd[p].r
#define mx(p) nd[p].mx
  void bld(int l = 0, int r = nums.size() - 1, int p = 1) {
    l(p) = l;
    r(p) = r;
    mx(p) = 0;
    if (l == r)
      return;
    int mid = l + r >> 1;
    bld(l, mid, p << 1);
    bld(mid + 1, r, p << 1 | 1);
  }
  void init() { bld(); }
  void sprup(int p) { mx(p) = max(mx(p << 1), mx(p << 1 | 1)); }
  void chg(int x, int v, int p = 1) {
    if (l(p) == r(p))
      return mx(p) = v, void();
    int mid = l(p) + r(p) >> 1;
    chg(x, v, p << 1 | (x > mid));
    sprup(p);
  }
  int _mx(int l, int r, int p = 1) {
    if (l > r)
      return 0;
    if (l <= l(p) && r >= r(p))
      return mx(p);
    int mid = l(p) + r(p) >> 1, res = 0;
    if (l <= mid)
      res = max(res, _mx(l, r, p << 1));
    if (r > mid)
      res = max(res, _mx(l, r, p << 1 | 1));
    return res;
  }
} segt;
int dp[N + 1], ans[N + 1];
void dfs(int x = 1, int fa = 0) {
  dp[x] = segt._mx(0, a[x] - 1) + 1;
  ans[x] = max(ans[fa], dp[x]);
  st[a[x]].insert(dp[x]);
  segt.chg(a[x], *--st[a[x]].end());
  for (int i = 0; i < nei[x].size(); i++) {
    int y = nei[x][i];
    if (y == fa)
      continue;
    dfs(y, x);
  }
  st[a[x]].erase(st[a[x]].find(dp[x]));
  segt.chg(a[x], *--st[a[x]].end());
}
int main() {
  cin >> n;
  for (int i = 1; i <= n; i++)
    cin >> a[i], nums.pb(a[i]);
  discrete();
  for (int i = 1; i < n; i++) {
    int x, y;
    cin >> x >> y;
    nei[x].pb(y);
    nei[y].pb(x);
  }
  for (int i = 0; i < nums.size(); i++)
    st[i].insert(0);
  segt.init();
  dfs();
  for (int i = 1; i <= n; i++)
    cout << ans[i] << "\n";
  return 0;
}
/*1
10
1 2 5 3 4 6 7 3 2 4
1 2
2 3
3 4
4 5
3 6
6 7
1 8
8 9
9 10
*/