#include "bits/stdc++.h"
using namespace std;
#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif
const int maxn = 2e5 + 5;
const int LG = 18;
int n, m, a[maxn];
int x[maxn], y[maxn], c[maxn];
pair<int, int> st[maxn][LG + 1];
vector<int> g[maxn];
int lg2[maxn];
int up[maxn][LG + 1], root;
vector<int> stars[maxn];
long long f[maxn];
long long fs[maxn];
int sz[maxn], head[maxn], h[maxn];
int tin[maxn], tout[maxn], rev[maxn], timer;
long long bit[maxn];
void update(int i, long long val) {
  for (; i <= n; i += i & (-i)) {
    bit[i] += val;
  }
}
long long get_sum(int i) {
  long long ans = 0;
  for (; i > 0; i -= i & (-i)) {
    ans += bit[i];
  }
  return ans;
}
long long get_sum(int l, int r) {
  return l > r ? 0 : get_sum(r) - get_sum(l - 1);
}
pair<int, int> get(int l, int r) {
  int p = lg2[r - l + 1];
  return min(st[l][p], st[r - (1 << p) + 1][p]);
}
int build_tree(int l, int r) {
  if (l > r) return -1;
  if (l == r) {
    sz[l] = 1;
    return l;
  }
  int mid = get(l, r).second;
  int lnd = build_tree(l, mid - 1), rnd = build_tree(mid + 1, r);
  sz[mid] = 1;
  if (lnd != -1) {
    sz[mid] += sz[lnd];
    up[lnd][0] = mid;
    g[mid].push_back(lnd);
  } 
  if (rnd != -1) {
    sz[mid] += sz[rnd];
    up[rnd][0] = mid;
    g[mid].push_back(rnd);
  }
  return mid;
}
void hld(int u) {
  if (!head[u]) {
    head[u] = u;
  }
  tin[u] = ++timer;
  rev[timer] = u;
  int big_child = -1;
  for (auto v:g[u]) {
    if (big_child == -1 || sz[big_child] < sz[v]) {
      big_child = v;
    }
  }
  if (big_child != -1) {
    h[big_child] = h[u] + 1;
    head[big_child] = head[u];
    hld(big_child);
  }
  for (auto v:g[u]) {
    if (v == big_child) continue;
    h[v] = h[u] + 1;
    hld(v);
  }
  tout[u] = timer;
}
long long get_path(int u, int v) {
  long long res = 0;
  while (head[u] != head[v]) {
    if (h[head[u]] > h[head[v]]) swap(u, v);
    res += get_sum(tin[head[v]], tin[v]);
    v = up[head[v]][0];
  }
  if (h[u] > h[v]) swap(u, v);
  res += get_sum(tin[u], tin[v]);
  return res;
}
void dfs(int u) {
  for (auto v:g[u]) {
    dfs(v);
    fs[u] += f[v];
  }
  f[u] = fs[u];
  update(tin[u], fs[u]);
  for (auto i:stars[u]) {
    int child = x[i];
    long long cur = c[i] + get_path(u, child);
    f[u] = max(f[u], cur);
//    debug(u, i, cur, get_path(u, child));
  }
//  debug(u, f[u]);
  update(tin[u], -f[u]);
}
void solve() {
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
    st[i][0] = make_pair(n - a[i], i);
  }
  for (int j = 1; j <= LG; ++j) {
    for (int i = 1; i + (1 << j) <= n + 1; ++i) {
      st[i][j] = min(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
    }
  }
  root = build_tree(1, n);
  for (int i = 1; i <= LG; ++i) {
    for (int u = 1; u <= n; ++u) {
      up[u][i] = up[up[u][i - 1]][i - 1];
    }
  }
  cin >> m;
  long long sum = 0;
  for (int i = 1; i <= m; ++i) {
    cin >> x[i] >> y[i] >> c[i];
    int cur = x[i];
    for (int j = LG; j >= 0; --j) {
      if (up[cur][j] and a[up[cur][j]] < y[i]) {
        cur = up[cur][j];
      }
    }
    stars[cur].push_back(i);
    debug(cur, x[i], c[i]);
    sum += c[i];
  }
  hld(root);
  dfs(root);
  debug(sum, f[root]);
  cout << sum - f[root];
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  
  for (int i = 2; i < maxn; ++i) {
    lg2[i] = lg2[i >> 1] + 1;
  }
  solve();
  return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |