Submission #1299873

#TimeUsernameProblemLanguageResultExecution timeMemory
1299873Jawad_Akbar_JJTwo Antennas (JOI19_antennas)C++20
22 / 100
259 ms13220 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
const int N = (1<<18) + 1, inf = 1.01e9;
int Mx[N<<1], c[N<<1], Lz[N<<1], Ans[N], a[N], b[N], l[N], r[N], h[N], n, q;
vector<pair<int, int>> Quer[N], vec;

void Push(int cur, int lc, int rc){
	Mx[lc] = max(Mx[lc], c[lc] - Lz[cur]), Lz[lc] = min(Lz[lc], Lz[cur]);
	Mx[rc] = max(Mx[rc], c[rc] - Lz[cur]), Lz[rc] = min(Lz[rc], Lz[cur]);
	
	Lz[cur] = inf;
}

void insert(int i, int vl, int cur = 1, int st = 1, int en = N){
	if (i >= en or i < st)
		return;
	if (en - st == 1){
		c[cur] = vl;
		return;
	}

	int lc = cur + cur, rc = lc + 1, mid = (st + en) / 2;
	Push(cur, lc, rc);
	insert(i, vl, lc, st, mid);
	insert(i, vl, rc, mid, en);

	c[cur] = max(c[lc], c[rc]);
	Mx[cur] = max(Mx[cur], max(Mx[lc], Mx[rc]));
}

void update(int l, int r, int vl, int cur = 1, int st = 1, int en = N){
	if (l >= en or r <= st)
		return;
	if (l <= st and r >= en){
		Mx[cur] = max(Mx[cur], c[cur] - vl);
		Lz[cur] = min(Lz[cur], vl);
		return;
	}
	int lc = cur + cur, rc = lc + 1, mid = (st + en) / 2;
	Push(cur, lc, rc);
	update(l, r, vl, lc, st, mid);
	update(l, r, vl, rc, mid, en);

	Mx[cur] = max(Mx[cur], max(Mx[lc], Mx[rc]));
}

int get(int l, int r, int cur = 1, int st = 1, int en = N){
	if (l >= en or r <= st)
		return 0;
	if (l <= st and r >= en)
		return Mx[cur];

	int lc = cur + cur, rc = lc + 1, mid = (st + en) / 2;
	Push(cur, lc, rc);
	return max(get(l, r, lc, st, mid), get(l, r, rc, mid, en));
}

void solve(){
	for (int i=1;i<(N<<1);i++)
		Mx[i] = c[i] = -inf, Lz[i] = inf;

	vec = {};
	for (int i=1;i<=n;i++){
		vec.push_back({i + a[i], i});
		vec.push_back({i + b[i] + 1, -i});
	}
	sort(rbegin(vec), rend(vec));

	for (int i=1;i<=q;i++)
		Quer[r[i]].push_back({l[i], i});

	for (int i=1;i<=n;i++){
		while (vec.size() > 0 and vec.back().first == i){
			int k = vec.back().second, vl = -inf;
			vec.pop_back();
			if (k > 0)
				vl = h[k], k = -k;
			insert(-k, vl);
		}
		update(max(0, i - b[i]), max(0, i - a[i] + 1), h[i]);

		for (auto [L, id] : Quer[i])
			Ans[id] = max(Ans[id], get(L, i));
		Quer[i] = {};
	}
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	cin>>n;

	for (int i=1;i<=n;i++)
		cin>>h[i]>>a[i]>>b[i];

	cin>>q;
	for (int i=1;i<=q;i++)
		cin>>l[i]>>r[i];

	solve();
	for (int i=1;i+i<=n;i++){
		swap(h[i], h[n - i + 1]);
		swap(a[i], a[n - i + 1]);
		swap(b[i], b[n - i + 1]);
	}

	for (int i=1;i<=q;i++)
		l[i] = n - l[i] + 1, r[i] = n - r[i] + 1, swap(l[i], r[i]);
	solve();

	for (int i=1;i<=q;i++)
		cout<<Ans[i]<<' ';
	cout<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...