제출 #1299003

#제출 시각아이디문제언어결과실행 시간메모리
1299003Bui_Quoc_CuongTwo Antennas (JOI19_antennas)C++20
100 / 100
582 ms41904 KiB
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int n, q;
int h[maxn], a[maxn], b[maxn];
vector <pair <int, int>> ask[maxn];
struct Node{
	int max_delta, min_val, max_val;
	Node(){
		max_delta = - 2e9;
		min_val = 2e9;
		max_val = - 2e9;
	}
	friend Node operator + (Node a, Node b){
		Node ans;
		ans.max_delta = max(a.max_delta, b.max_delta);
		ans.min_val = min(a.min_val, b.min_val);
		ans.max_val = max(a.max_val, b.max_val);
		return ans;
	}
} st[4 * maxn];
vector <int> op[maxn], cl[maxn];
int lazy_max[4 * maxn], lazy_min[4 * maxn], ans[maxn];

void apply(int id, int val_max, int val_min){
	if(st[id].max_val != - 2e9){
		if(val_max != - 2e9)
		st[id].max_delta = max(st[id].max_delta, abs(val_max - st[id].max_val));

		if(val_min != 2e9)
		st[id].max_delta = max(st[id].max_delta, abs(val_min - st[id].max_val));
	}
	if(st[id].min_val != 2e9){
		if(val_max != - 2e9)
		st[id].max_delta = max(st[id].max_delta, abs(val_max - st[id].min_val));

		if(val_min != 2e9)
		st[id].max_delta = max(st[id].max_delta, abs(val_min - st[id].min_val));
	}
	lazy_max[id] = max(lazy_max[id], val_max);
	lazy_min[id] = min(lazy_min[id], val_min);
}

void pushDown(int id){
	if(lazy_max[id] != - 2e9 && lazy_min[id] != 2e9){
		apply(id << 1, lazy_max[id], lazy_min[id]);
		apply(id << 1 | 1, lazy_max[id], lazy_min[id]);
		lazy_max[id] = - 2e9;
		lazy_min[id] = 2e9;
	}
}

void upPoint(int pos, int type, int id = 1, int l = 1, int r = n){
	if(pos < l || pos > r) return;
	if(l == r){
		if(type == 0){
			st[id].max_val = - 2e9;
			st[id].min_val = 2e9;
		} else{
			st[id].max_val = st[id].min_val = h[pos];
			st[id].max_delta = - 2e9;
		}
		return;
	}
	pushDown(id);
	int mid = (l + r) >> 1;
	upPoint(pos, type, id << 1, l, mid);
	upPoint(pos, type, id << 1 | 1, mid + 1, r);
	st[id] = st[id << 1] + st[id << 1 | 1];
}

void update(int id, int l, int r, int u, int v, int val){
	if(l > v || r < u) return;
	if(l >= u && r <= v){
		apply(id, val, val);
		return;
	}
	pushDown(id);
	int mid = (l + r) >> 1;
	update(id << 1, l, mid, u, v, val);
	update(id << 1 | 1, mid + 1, r, u, v, val);
	st[id] = st[id << 1] + st[id << 1 | 1];
}

Node get(int id, int l, int r, int u, int v){
	if(l > v || r < u) return Node();
	if(l >= u && r <= v) return st[id];
	pushDown(id);
	int mid = (l + r) >> 1;
	return get(id << 1, l, mid, u, v) + get(id << 1 | 1, mid + 1, r, u, v);
}

int32_t main(){
    ios_base::sync_with_stdio(0); cin.tie(0); 
    #define koa "phatmang"
    if(fopen(koa".inp", "r")){
        freopen(koa".inp", "r", stdin); freopen(koa".out", "w", stdout);
    }
    cin >> n;
    for(int i = 1; i <= n; i++){
    	cin >> h[i] >> a[i] >> b[i];
    	if(a[i] + i <= n){
    		op[a[i] + i].push_back(i);
    	} 
    	if(b[i] + i + 1 <= n){
    		cl[b[i] + i + 1].push_back(i);
    	}
    }
    cin >> q;
    for(int i = 1; i <= q; i++){
    	int l, r; cin >> l >> r;
    	ask[r].push_back(make_pair(l, i));
    }
    for(int i = 1; i <= 4 * n; i++){
    	st[i] = Node();
    	lazy_max[i] = - 2e9;
    	lazy_min[i] = 2e9;
    }
    for(int i = 1; i <= n; i++){
    	for(int &id : op[i]){
    		upPoint(id, 1);
    	}
    	for(int &id : cl[i]){
    		upPoint(id, 0);
    	}
    	if(i - a[i] >= 1){
    		update(1, 1, n, max(1, i - b[i]), i - a[i], h[i]);
    	}
    	for(auto it : ask[i]){
    		int l = it.first, id = it.second;
    		ans[id] = get(1, 1, n, l, i).max_delta;
    	}
    }
    for(int i = 1; i <= q; i++){
    	cout << (ans[i] == - 2e9 ? - 1 : ans[i]) << "\n";
    }
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

antennas.cpp: In function 'int32_t main()':
antennas.cpp:97:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   97 |         freopen(koa".inp", "r", stdin); freopen(koa".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
antennas.cpp:97:48: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   97 |         freopen(koa".inp", "r", stdin); freopen(koa".out", "w", stdout);
      |                                         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...