Submission #1299003

#TimeUsernameProblemLanguageResultExecution timeMemory
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; }

Compilation message (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...