제출 #1272802

#제출 시각아이디문제언어결과실행 시간메모리
1272802ortsacCurtains (NOI23_curtains)C++20
100 / 100
1159 ms60836 KiB
#include <bits/stdc++.h>

using namespace std;

// ok a seg tem que ter duas operações
// 1 -> settar todos os elementos x no range [l, r] para max(x, v)
// 2 -> query [l, r] para min value no range

#define pii pair<int, int>

const int MAXN = 5e5;
int lazy[4*MAXN];
int seg[4*MAXN];
const int INF = 0x3f3f3f3f;
// its already built, all zeroes!!

void unlazy(int node, int l, int r) {
    if (lazy[node] == 0) return;
    seg[node] = max(seg[node], lazy[node]);
    if (l < r) {
        lazy[2*node] = max(lazy[2*node], lazy[node]);
        lazy[2*node + 1] = max(lazy[2*node + 1], lazy[node]);
    }
    lazy[node] = 0;
}

void update(int node, int l, int r, int tl, int tr, int x) {
    unlazy(node, l, r);
    if ((tr < l) || (r < tl)) return;
    if ((tl <= l) && (r <= tr)) {
        lazy[node] = x;
        unlazy(node, l, r);
        return;
    }
    int m = (l + r)/2;
    update(2*node, l, m, tl, tr, x);
    update(2*node + 1, m + 1, r, tl, tr, x);
    seg[node] = min(seg[2*node], seg[2*node + 1]);
}

int query(int node, int l, int r, int tl, int tr) {
    unlazy(node, l, r);
    if ((tr < l) || (r < tl)) return INF;
    if ((tl <= l) && (r <= tr)) return seg[node];
    int m = (l + r)/2;
    return min(query(2*node, l, m, tl, tr), query(2*node + 1, m + 1, r, tl, tr));
}

int32_t main() {
    int n, m, q;
    cin >> n >> m >> q;
    vector<vector<int>> lForR(n + 1);
    vector<vector<pii>> queriesForR(n + 1);
    for (int i = 0; i < m; i++) {
        int l, r;
        cin >> l >> r;
        lForR[r].push_back(l);
    }
    for (int i = 0; i < q; i++) {
        int l, r;
        cin >> l >> r;
        queriesForR[r].push_back({l, i});
    }
    vector<int> ans(q);
    for (int r = 1; r <= n; r++) {
        for (auto l : lForR[r]) {
            update(1, 1, n, l, r, l);
        }
        for (auto [l, idx] : queriesForR[r]) {
            int x = query(1, 1, n, l, r);
            if (x == l) ans[idx] = 1;
        }
    }
    for (auto u : ans) if (u) cout << "YES\n"; else cout << "NO\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...