#include<bits/stdc++.h>
#define ll long long
#define task ""
using namespace std;
const int maxn = 1e6 + 2, LG = 20, inf = 1e9;
int n, q, a[maxn], st[LG][maxn], l[maxn], r[maxn], t, tin[maxn], tout[maxn], m, x[maxn], y[maxn], c[maxn];
ll fw[maxn], dp[maxn], sum = 0;
vector<int> stars[maxn];
void upd (int x, int val)
{
for (; x <= n; x += (x & (-x)))
fw[x] += val;
}
ll get (int x)
{
ll res = 0;
for (; x > 0; x -= (x & (-x)))
res += fw[x];
return res;
}
void dfs (int u)
{
tin[u] = ++t;
if (l[u] != -1)
{
dfs(l[u]);
dp[u] += dp[l[u]];
}
if (r[u] != -1)
{
dfs(r[u]);
dp[u] += dp[r[u]];
}
if (l[u] != -1 && r[u] != -1)
{
upd(tin[l[u]], dp[r[u]]);
upd(tout[l[u]] + 1, -dp[r[u]]);
upd(tin[r[u]], dp[l[u]]);
upd(tout[r[u]] + 1, -dp[l[u]]);
}
for (int i : stars[u])
{
//cout << "stars " << i << " " << x[i] << " " << u << '\n';
ll tmp = get(tin[x[i]]) + c[i];
if (l[x[i]] != -1) tmp += dp[l[x[i]]];
if (r[x[i]] != -1) tmp += dp[r[x[i]]];
dp[u] = max(dp[u], tmp);
}
tout[u] = t;
//cout << u << " " << dp[u] << '\n';
}
int main()
{
//freopen(task".INP", "r", stdin);
//freopen(task".OUT", "w", stdout);
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
a[0] = inf;
l[0] = r[0] = -1;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
l[i] = r[i] = -1;
int j = i - 1;
while (a[j] < a[i]) j = st[0][j];
int k = r[j];
st[0][i] = j;
r[j] = i;
if (k != -1)
{
st[0][k] = i;
l[i] = k;
}
}
for (int j = 1; j < LG; j++)
for (int i = 1; i <= n; i++)
st[j][i] = st[j - 1][st[j - 1][i]];
cin >> q;
for (int i = 1; i <= q; i++)
{
cin >> x[i] >> y[i] >> c[i];
int u = x[i];
for (int j = LG - 1; j >= 0; j--)
if (st[j][u] != 0 && a[st[j][u]] < y[i])
{
u = st[j][u];
}
stars[u].push_back(i);
sum += c[i];
}
dfs(r[0]);
cout << sum - dp[r[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... |