Submission #1298058

#TimeUsernameProblemLanguageResultExecution timeMemory
1298058BahaminTwo Antennas (JOI19_antennas)C++20
100 / 100
379 ms52084 KiB
#include <bits/stdc++.h>

using namespace std;

template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; }
template<typename T_container, typename T = typename enable_if<!is_same<T_container, string>::value, typename T_container::value_type>::type> ostream& operator<<(ostream &os, const T_container &v) { os << '{'; string sep; for (const T &x : v) os << sep << x, sep = ", "; return os << '}'; }

#define ll long long
#define ld long double
#define all(a) (a).begin(), (a).end()
#define sui cout.tie(NULL); cin.tie(NULL); ios_base::sync_with_stdio(false)
#define lid id << 1
#define rid id << 1 | 1
#define mid ((r + l) >> 1)
const ll MAX_N = 2e5 + 5;
const ll MOD = 1e9 + 7;
const ll INF = 1e12;
const ld EPS = 1e-9;
const ll LOG = 30;

pair<ll, pair<ll, ll>> seg[MAX_N << 2];
pair<ll, ll> ops[MAX_N << 2];
ll h[MAX_N];

void build(ll l, ll r, ll id)
{
    seg[id] = {-INF, {-INF, INF}};
    ops[id] = {-INF, INF};
    if (l == r - 1) return;
    build(l, mid, lid);
    build(mid, r, rid);
}

void move(ll l, ll r, ll id)
{
    if (l == r - 1) return;
    seg[lid].first = max({seg[lid].first, ops[id].first - seg[lid].second.second, seg[lid].second.first - ops[id].second});
    seg[rid].first = max({seg[rid].first, ops[id].first - seg[rid].second.second, seg[rid].second.first - ops[id].second});
    ops[lid].first = max(ops[lid].first, ops[id].first);
    ops[lid].second = min(ops[lid].second, ops[id].second);
    ops[rid].first = max(ops[rid].first, ops[id].first);
    ops[rid].second = min(ops[rid].second, ops[id].second);
    ops[id] = {-INF, INF};
}

pair<ll, pair<ll, ll>> merge(pair<ll, pair<ll, ll>> x, pair<ll, pair<ll, ll>> y)
{
    pair<ll, pair<ll, ll>> re;
    re.first = max(x.first, y.first);
    re.second.first = max(x.second.first, y.second.first);
    re.second.second = min(x.second.second, y.second.second);
    return re;
}

void upd(ll s, ll t, ll x, ll l, ll r, ll id)
{
    move(l, r, id);
    if (s <= l && t >= r)
    {
        ops[id].first = max(ops[id].first, x);
        ops[id].second = min(ops[id].second, x);
        seg[id].first = max({seg[id].first, x - seg[id].second.second, seg[id].second.first - x});
        return;
    }
    if (s < mid) upd(s, t, x, l, mid, lid);
    if (t > mid) upd(s, t, x, mid, r, rid);
    seg[id] = merge(seg[lid], seg[rid]);
}

void rem(ll x, ll l, ll r, ll id)
{
    move(l, r, id);
    if (l == r - 1)
    {
        seg[id].second = {-INF, INF};
        return;
    }
    if (x < mid) rem(x, l, mid, lid);
    else rem(x, mid, r, rid);
    seg[id] = merge(seg[lid], seg[rid]);
}

void add(ll x, ll l, ll r, ll id)
{
    move(l, r, id);
    if (l == r - 1)
    {
        seg[id].second = {h[l], h[l]};
        return;
    }
    if (x < mid) add(x, l, mid, lid);
    else add(x, mid, r, rid);
    seg[id] = merge(seg[lid], seg[rid]);
}

ll get(ll s, ll t, ll l, ll r, ll id)
{
    move(l, r, id);
    if (s <= l && t >= r) return seg[id].first;
    if (s >= r || t <= l) return -INF;
    return max(get(s, t, l, mid, lid), get(s, t, mid, r, rid));
}

void solve() {
    ll n;
    cin >> n;
    ll a[n];
    ll b[n];
    for (ll i = 0; i < n; i++) cin >> h[i] >> a[i] >> b[i];
    ll q;
    cin >> q;
    ll ans[q];
    vector<pair<ll, ll>> qs[n];
    for (ll i = 0; i < q; i++)
    {
        ll l, r;
        cin >> l >> r;
        l--, r--;
        qs[l].push_back({r, i});
    }
    vector<ll> add1[n];
    vector<ll> rem1[n];
    for (ll i = 0; i < n; i++) 
    {
        if (i - a[i] >= 0) add1[i - a[i]].push_back(i);
        if (i - b[i] - 1 >= 0) rem1[i - b[i] - 1].push_back(i);
    }
    build(0, n, 1);
    for (ll i = n - 1; i >= 0; i--)
    {
        for (ll x : add1[i]) add(x, 0, n, 1);
        for (ll x : rem1[i]) rem(x, 0, n, 1);
        if (i + a[i] < n) upd(i + a[i], min(n, i + b[i] + 1), h[i], 0, n, 1); 
        for (auto x : qs[i]) ans[x.second] = get(i, x.first + 1, 0, n, 1);
    }
    for (ll i = 0; i < q; i++) cout << max(ans[i], (ll) -1) << "\n";
}   

int main() {
    sui;
    ll tc = 1;
    //cin >> tc;
    for (ll t = 1; t <= tc; t++) {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...