Submission #123899

#TimeUsernameProblemLanguageResultExecution timeMemory
123899sebinkimTwo Antennas (JOI19_antennas)C++14
100 / 100
860 ms39432 KiB
#include <bits/stdc++.h>

using namespace std;

struct segtree{
	int T[606060], L[606060], C[606060];
	
	void spread(int p)
	{
		L[p << 1] = max(L[p << 1], L[p]);
		T[p << 1] = max(T[p << 1], L[p << 1] - C[p << 1]);
		L[p << 1 | 1] = max(L[p << 1 | 1], L[p]);
		T[p << 1 | 1] = max(T[p << 1 | 1], L[p << 1 | 1] - C[p << 1 | 1]);
		L[p] = 0;
	}
	
	void update(int p)
	{
		C[p] = min(C[p << 1], C[p << 1 | 1]);
		T[p] = max(T[p << 1], T[p << 1 | 1]);
	}
	
	void init(int p, int s, int e)
	{
		T[p] = -1e9, L[p] = 0, C[p] = 2e9;
		if(s != e){
			init(p << 1, s, s + e >> 1);
			init(p << 1 | 1, (s + e >> 1) + 1, e);
		}
	}
	
	void update1(int p, int s, int e, int v, int c)
	{
		if(s == e) L[p] = 0, C[p] = c;
		else{
			spread(p);
			if(v <= (s + e >> 1)) update1(p << 1, s, s + e >> 1, v, c);
			else update1(p << 1 | 1, (s + e >> 1) + 1, e, v, c);
			update(p);
		}
	}
	
	void update2(int p, int s, int e, int l, int r, int c)
	{
		if(e < l || r < s) return;
		else if(l <= s && e <= r){
			L[p] = max(L[p], c);
			T[p] = max(T[p], L[p] - C[p]);
			return;
		}
		
		spread(p);
		update2(p << 1, s, s + e >> 1, l, r, c);
		update2(p << 1 | 1, (s + e >> 1) + 1, e, l, r, c);
		update(p);
	}
	
	int getmax(int p, int s, int e, int l, int r)
	{
		if(e < l || r < s) return -1e9;
		else if(l <= s && e <= r) return T[p];
		
		spread(p);
		int ret = getmax(p << 1, s, s + e >> 1, l, r);
		ret = max(ret, getmax(p << 1 | 1, (s + e >> 1) + 1, e, l, r));
		update(p);
		
		return ret;
	}
};

segtree T;
vector <int> V[202020], Q[202020];
int H[202020], A[201010], B[202020];
int L[202020], R[202020], X[202020];
int n, q;

void f()
{
	int i;
	
	T.init(1, 1, n);
	
	for(i=1; i<=n; i++){
		V[i].clear(); Q[i].clear();
	}
	
	for(i=1; i<=q; i++){
		Q[R[i]].push_back(i);
	}
	
	for(i=1; i<=n; i++){
		if(i + A[i] <= n) V[i + A[i]].push_back(i);
		if(i + B[i] < n) V[i + B[i] + 1].push_back(-i);
		
		for(int &t: V[i]){
			if(t > 0) T.update1(1, 1, n, t, H[t]);
			else T.update1(1, 1, n, -t, 2e9);
		}
		
		if(i - A[i] >= 1){
			T.update2(1, 1, n, max(1, i - B[i]), i - A[i], H[i]);
		}
		
		for(int &t: Q[i]){
			X[t] = max(X[t], T.getmax(1, 1, n, L[t], i));
		}
	}
}

int main()
{
	int i;
	
	scanf("%d", &n);
	
	for(i=1; i<=n; i++){
		scanf("%d%d%d", H + i, A + i, B + i);
	}
	
	scanf("%d", &q);
	
	for(i=1; i<=q; i++){
		scanf("%d%d", L + i, R + i);
		X[i] = -1;
	}
	
	f();
	
	reverse(H + 1, H + n + 1);
	reverse(A + 1, A + n + 1);
	reverse(B + 1, B + n + 1);
	
	for(i=1; i<=q; i++){
		L[i] = n + 1 - L[i];
		R[i] = n + 1 - R[i];
		swap(L[i], R[i]);
	}
	
	f();
	
	for(i=1; i<=q; i++){
		printf("%d\n", X[i]);
	}
	
	return 0;
}

Compilation message (stderr)

antennas.cpp: In member function 'void segtree::init(int, int, int)':
antennas.cpp:27:22: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
    init(p << 1, s, s + e >> 1);
                    ~~^~~
antennas.cpp:28:24: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
    init(p << 1 | 1, (s + e >> 1) + 1, e);
                      ~~^~~
antennas.cpp: In member function 'void segtree::update1(int, int, int, int, int)':
antennas.cpp:37:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
    if(v <= (s + e >> 1)) update1(p << 1, s, s + e >> 1, v, c);
             ~~^~~
antennas.cpp:37:47: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
    if(v <= (s + e >> 1)) update1(p << 1, s, s + e >> 1, v, c);
                                             ~~^~~
antennas.cpp:38:32: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
    else update1(p << 1 | 1, (s + e >> 1) + 1, e, v, c);
                              ~~^~~
antennas.cpp: In member function 'void segtree::update2(int, int, int, int, int, int)':
antennas.cpp:53:24: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   update2(p << 1, s, s + e >> 1, l, r, c);
                      ~~^~~
antennas.cpp:54:26: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   update2(p << 1 | 1, (s + e >> 1) + 1, e, l, r, c);
                        ~~^~~
antennas.cpp: In member function 'int segtree::getmax(int, int, int, int, int)':
antennas.cpp:64:33: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int ret = getmax(p << 1, s, s + e >> 1, l, r);
                               ~~^~~
antennas.cpp:65:40: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   ret = max(ret, getmax(p << 1 | 1, (s + e >> 1) + 1, e, l, r));
                                      ~~^~~
antennas.cpp: In function 'int main()':
antennas.cpp:115:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n);
  ~~~~~^~~~~~~~~~
antennas.cpp:118:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d", H + i, A + i, B + i);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
antennas.cpp:121:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &q);
  ~~~~~^~~~~~~~~~
antennas.cpp:124:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", L + i, R + i);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...