제출 #361827

#제출 시각아이디문제언어결과실행 시간메모리
361827VanjanjaTwo Antennas (JOI19_antennas)C++14
100 / 100
1127 ms33696 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 2 * 1e5, inf = 1e9 + 7;
int a[N];
pair<int, int> b[N];
vector<pair<int, int>> que[N];
int resenje[N];
int segDP[4 * N], segM[4 * N][2];
pair<int, int> lazy[4 * N];

void build(int u, int l, int r) {
    segDP[u] = -1, lazy[u].second = inf;
    segM[u][0] = -inf, segM[u][1] = inf;
    if (l == r)
        return;
    int mid = l + r >> 1;
    build(u*2+1,l,mid);
    build(u*2+2,mid+1,r);
}

void update1(int u, int x) {
    if (segM[u][0] == -inf)
        return;
    segDP[u] = max(segDP[u], max(abs(x - segM[u][0]), abs(x - segM[u][1])));
    lazy[u].first = max(lazy[u].first, x);
    lazy[u].second = min(lazy[u].second, x);
}

void shift(int u) {
    if (lazy[u].first) {
        update1(u*2+1,lazy[u].first);
        update1(u*2+2,lazy[u].first);
        lazy[u].first = 0;
    }
    if (lazy[u].second != inf) {
        update1(u*2+1,lazy[u].second);
        update1(u*2+2,lazy[u].second);
        lazy[u].second = inf;
    }
}

void update(int u, int l, int r, int L, int R, int x) {
    if (l > R || r < L)
        return;
    if (l >= L && r <= R) {
        update1(u, x);
        return;
    }
    shift(u);
    int mid = l + r >> 1;
    update(u*2+1,l,mid,L,R,x);
    update(u*2+2,mid+1,r,L,R,x);
    segDP[u] = max(segDP[u*2+1],segDP[u*2+2]);
}

void add(int u, int l, int r, int i, bool p) {
    if (l == r) {
        if (p) {
            segM[u][0] = a[i];
            segM[u][1] = a[i];
            return;
        }
        segM[u][0] = -inf;
        segM[u][1] = inf;
        return;
    }
    shift(u);
    int mid = l + r >> 1;
    if (l <= i && i <= mid)
        add(u*2+1, l, mid, i, p);
    else
        add(u*2+2, mid+1, r, i, p);
    segM[u][0] = max(segM[u*2+1][0], segM[u*2+2][0]);
    segM[u][1] = min(segM[u*2+1][1], segM[u*2+2][1]);
}

int out(int u, int l, int r, int L, int R) {
    if (l > R || r < L)
        return -1;
    if (l >= L && r <= R) {
        return segDP[u] == -inf? -1:segDP[u];
    }
    shift(u);
    int mid = l + r >> 1;
    return max(out(u*2+1,l,mid,L,R), out(u*2+2,mid+1,r,L,R));
}

void solve() {
    int n, q;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i] >> b[i].first >> b[i].second;
    }
    cin >> q;
    for (int i = 0; i < q; i++) {
        int l, r;
        cin >> l >> r;
        que[l - 1].push_back({r - 1, i});
    }
    build(0, 0, n - 1);
    priority_queue<pair<int, int>> d;
    priority_queue<pair<int, int>> l;
    for (int i = n - 1; i >= 0; i--) {
        while (d.size() && d.top().first >= i) {
            add(0, 0, n - 1, d.top().second, 1);
            l.push({d.top().second - b[d.top().second].second, d.top().second});
            d.pop();
        }
        while (l.size() && l.top().first > i) {
            add(0, 0, n - 1, l.top().second, 0);
            l.pop();
        }
        update(0, 0, n - 1, i + b[i].first, min(i + b[i].second, n - 1), a[i]);
        d.push({i - b[i].first, i});
        for (auto j = que[i].begin(); j != que[i].end(); j++) {
            resenje[(*j).second] = out(0, 0, n - 1, i, (*j).first);
        }
    }
    for (int i = 0; i < q; i++)
        cout << resenje[i] << endl;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    solve();
    return 0;
}

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

antennas.cpp: In function 'void build(int, int, int)':
antennas.cpp:17:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   17 |     int mid = l + r >> 1;
      |               ~~^~~
antennas.cpp: In function 'void update(int, int, int, int, int, int)':
antennas.cpp:51:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   51 |     int mid = l + r >> 1;
      |               ~~^~~
antennas.cpp: In function 'void add(int, int, int, int, bool)':
antennas.cpp:69:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   69 |     int mid = l + r >> 1;
      |               ~~^~~
antennas.cpp: In function 'int out(int, int, int, int, int)':
antennas.cpp:85:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   85 |     int mid = l + r >> 1;
      |               ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...