제출 #132117

#제출 시각아이디문제언어결과실행 시간메모리
132117SirCenessTwo Antennas (JOI19_antennas)C++14
0 / 100
684 ms31872 KiB
#include <bits/stdc++.h>

using namespace std;
#define mod 1000000007
#define mp make_pair
#define pb push_back
#define bas(x) #x << ": " << x << " "
#define prarr(x, n) cout << #x << ": "; for (int qsd = 0; qsd < n; qsd++) cout << x[qsd] << " "; cout << endl;
#define prarrv(x) cout << #x << ": "; for (int qsd = 0; qsd < (int)x.size(); qsd++) cout << x[qsd] << " "; cout << endl;
#define inside sl<=l&&r<=sr
#define outside sr<l||r<sl



typedef long long ll;
const ll INF = 1e9;

int n, q;
pair<ll, pair<int, int> > arr[200005];
list<pair<int, int> > events[200005];
ll stmin[800005];
ll stmax[800005];

void stcmax(int node, int l, int r){
	//cout << "stcmax(" << node << "," << l << ", " << r << ")"<< endl;
	if (l == r) stmax[node] = -INF;
	else {
		int m = (l+r)/2;
		stcmax(node*2, l, m);
		stcmax(node*2+1, m+1, r);
		stmax[node] = -INF;
	}
}

void stumax(int node, int l, int r, int ind, int val){
	if (l == r) stmax[node] = val;
	else {
		int m = (l+r)/2;
		if (ind <= m) stumax(node*2, l, m, ind, val);
		else stumax(node*2+1, m+1, r, ind, val);
		stmax[node] = max(stmax[node*2], stmax[node*2+1]);
	}
}

ll stqmax(int node, int l, int r, int sl, int sr){
	if (sl<=l&&r<=sr) return stmax[node];
	else if (sr<l||r<sl) return -INF;
	else {
		int m = (l+r)/2;
		return max(stqmax(node*2, l, m, sl, sr), stqmax(node*2+1, m+1, r, sl, sr));
	}
}


void stcmin(int node, int l, int r){
	if (l == r) stmin[node] = INF;
	else {
		int m = (l+r)/2;
		stcmin(node*2, l, m);
		stcmin(node*2+1, m+1, r);
		stmin[node] = INF;
	}
}

void stumin(int node, int l, int r, int ind, int val){
	if (l == r) stmin[node] = val;
	else {
		int m = (l+r)/2;
		if (ind <= m) stumin(node*2, l, m, ind, val);
		else stumin(node*2+1, m+1, r, ind, val);
		stmin[node] = min(stmin[node*2], stmin[node*2+1]);
	}
}

ll stqmin(int node, int l, int r, int sl, int sr){
	if (sl<=l&&r<=sr) return stmin[node];
	else if (sr<l||r<sl) return INF;
	else {
		int m = (l+r)/2;
		return min(stqmin(node*2, l, m, sl, sr), stqmin(node*2+1, m+1, r, sl, sr));
	}
}

int main(){
	cin >> n;
	for (int i = 0; i < n; i++){
		int w, a, b;
		cin >> w >> a >> b;
		arr[i] = mp(w, mp(a, b));
		events[max(0, i-b)].pb(mp(1, i));
		events[max(0, i-a+1)].pb(mp(-1, i));
	}
	
	ll ans = 0;
	
	stcmax(1, 0, n-1);
	//cout << "here" << endl;	
	
	for (int i = 0; i < n; i++){
		for (pair<int, int> eleman: events[i]){
			//cout << bas(eleman.first) << bas(eleman.second) << endl;
			if (eleman.first == 1){
				//cout << "set: " << eleman.second << endl;
				stumax(1, 0, n-1, eleman.second, arr[eleman.second].first);
				stumin(1, 0, n-1, eleman.second, arr[eleman.second].first);
			} else {
				//cout << "reset: " << i << endl;
				stumax(1, 0, n-1, eleman.second, -INF);
				stumin(1, 0, n-1, eleman.second, INF);
			}
		}
		//cout << "//islem\n";
		int rl = arr[i].second.first+i;
		int rr = arr[i].second.second+i;
		//cout << "query: " << rl << "," << rr << endl;
		//cout << bas(stqmax(1, 0, n-1, rl, rr)) << bas(stqmin(1, 0, n-1, rl, rr)) << endl;
		ans = max(ans, stqmax(1, 0, n-1, rl, rr) - arr[i].first);
		ans = max(ans, - stqmin(1, 0, n-1, rl, rr) + arr[i].first);
		//cout << bas(ans) << endl;
	}
	
	cout << ans << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...