Submission #519044

#TimeUsernameProblemLanguageResultExecution timeMemory
519044fatemetmhrConstellation 3 (JOI20_constellation3)C++17
100 / 100
572 ms116824 KiB
//  ~Be name khoda~  //

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

#define pb       push_back
#define mp       make_pair
#define all(x)   x.begin(), x.end()
#define fi       first
#define se       second
#define cl       clear
#define endll    '\n'

const int maxn  =  1e6   + 10;
const int maxn5 =  2e5   + 10;
const int maxnt =  1.2e6 + 10;
const int maxn3 =  1e3   + 10;
const int mod   =  1e9   +  7;
const int lg    =  18;
const ll  inf   =  2e18;

ll dp[maxn5], sum[maxn5];
ll lazy[maxnt];
pair <int, int> mx[lg][maxn5];
vector <int> adj[maxn5];
int st[maxn5], ft[maxn5], n, mxx[lg][maxn5];
int ti = -1, a[maxn5], par[lg][maxn5];
vector <pair<int, ll>> av[maxn5];

inline void add(int l, int r, int lq, int rq, ll val, int v){
	if(rq <= l || r <= lq)
		return;
	if(lq <= l && r <= rq){
		lazy[v] += val;
		return;
	}
	int mid = (l + r) >> 1;
	add(l, mid, lq, rq, val, v * 2);
	add(mid, r, lq, rq, val, v * 2 + 1);
	return;
}

inline ll get(int l, int r, int ind, int v){
	if(r - l == 1)
		return lazy[v];
	int mid = (l + r) >> 1;
	if(ind < mid)
		return lazy[v] + get(l, mid, ind, v * 2);
	return lazy[v] + get(mid, r, ind, v * 2 + 1);
}

inline int get_max(int l, int r){
	int k = 0;
	while((1 << (k + 1)) <= r - l + 1)
		k++;
	return max(mx[k][l], mx[k][r - (1 << k) + 1]).se;
}

inline int make_tree(int l, int r, int pa){
	int p = get_max(l, r - 1);
	par[0][p] = pa;
	if(p > l)
		adj[p].pb(make_tree(l, p, p));
	if(p + 1 < r)
		adj[p].pb(make_tree(p + 1, r, p));
	return p;
}

inline void dfs(int v){
	st[v] = ++ti;
	for(auto u : adj[v]){
		dfs(u);
		sum[v] += dp[u];
	}
	ft[v] = ti;
	dp[v] = sum[v];
	for(auto [u, c] : av[v]){
		if(u == v){
			dp[v] = max(dp[v], c + sum[v]);
			continue;
		}
		int z = adj[v][0];
		if(ft[z] < ft[u])
			z = adj[v][1];
		dp[v] = max(dp[v], c + sum[v] - dp[z] + get(0, n, st[u], 1));
		//cout << "hey! " << v << ' ' << dp[v] << ' ' << u << ' ' << z << ' ' << c << ' ' << get(0, n, st[u], 1) << '\n';
	}
	for(auto u : adj[v]){
		add(0, n, st[u], ft[u] + 1, sum[v] - dp[u], 1);
	}
	add(0, n, st[v], st[v] + 1, sum[v], 1);
	//cout << v << ' ' << dp[v] << '\n';
	return;
}

inline void dfs_lca(int v){
	if(par[0][v] != -1)
		mxx[0][v] = max(a[v], a[par[0][v]]);
	for(int i = 1; i < lg && par[i - 1][v] != -1; i++){
		par[i][v] = par[i - 1][par[i - 1][v]];
		mxx[i][v] = max(mxx[i - 1][v], mxx[i - 1][par[i - 1][v]]);
	}
	for(auto u : adj[v])
		dfs_lca(u);
	return;
}

int main()
{
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	
	cin >> n;
	for(int i = 0; i < n; i++){
		cin >> a[i];
		mx[0][i] = {a[i], i};
	}
	
		
	for(int i = 0; i < lg; i++) for(int j = 0; j < n; j++)
		par[i][j] = -1;

	for(int i = 1; i < lg; i++) for(int j = 0; j + (1 << i) - 1 < n; j++)
		mx[i][j] = max(mx[i - 1][j], mx[i - 1][j + (1 << (i - 1))]);
	int r = make_tree(0, n, -1);

	dfs_lca(r);
	
	int m; cin >> m;
	ll summ = 0;
	for(int i = 0; i < m; i++){
		int x, y, c; cin >> x >> y >> c;
		x--;
		int v = x;
		for(int i = lg - 1; i >= 0; i--) if(par[i][v] != -1 && mxx[i][v] < y){
			//cout << "ahaaa " << i << ' '<< v << ' '<< mxx[i][v] << ' ' << par[i][v] << '\n';
			v = par[i][v];
		}
		av[v].pb({x, c});
		summ += c;
		//cout << "aha " << x << ' ' << y << ' ' << v << ' ' << c << '\n';
	}
	dfs(r);
	cout << summ - dp[r] << endl;
}














#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...