Submission #1124400

#TimeUsernameProblemLanguageResultExecution timeMemory
1124400HiepVu217Curtains (NOI23_curtains)C++20
100 / 100
696 ms37972 KiB
#include <bits/stdc++.h>
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
using namespace std;
const int N = 5e5 + 17;
int n, m, q, st[4 * N], lz[4 * N];
string ans[N];
struct qrs
{
    int l, r, id;
    bool operator < (const qrs &o) const
    {
        if (r != o.r)
        {
            return r < o.r;
        }
        return id < o.id;
    }
} qr[2 * N];
inline void down (int id)
{
    st[id * 2] = max (lz[id], st[id * 2]);
    lz[id * 2] = max (lz[id], lz[id * 2]);
    st[id * 2 + 1] = max (lz[id], st[id * 2 + 1]);
    lz[id * 2 + 1] = max (lz[id], lz[id * 2 + 1]);
    lz[id] = 0;
}
inline void update (int id, int l, int r, int u, int v, int x)
{
    if (v < l || r < u)
    {
        return;
    }
    if (u <= l && r <= v)
    {
        st[id] = max (st[id], x);
        lz[id] = max (lz[id], x);
        return;
    }
    int mid = l + r >> 1;
    down(id);
    update (id * 2, l, mid, u, v, x);
    update (id * 2 + 1, mid + 1, r, u, v, x);
    st[id] = min (st[id * 2], st[id * 2 + 1]);
}
inline int get (int id, int l, int r, int u, int v)
{
    if (v < l || r < u)
    {
        return n + 1;
    }
    if (u <= l && r <= v)
    {
        return st[id];
    }
    int mid = l + r >> 1;
    down(id);
    return min (get (id * 2, l, mid, u, v), get (id * 2 + 1, mid + 1, r, u, v));
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m >> q;
    for (int i = 1, l, r; i <= m; ++i)
    {
        cin >> l >> r;
        qr[i] = {l, r, 0};
    }
    for (int i = 1, l, r; i <= q; ++i)
    {
        cin >> l >> r;
        qr[m + i] = {l, r, i};
    }
    sort (qr + 1, qr + m + q + 1);
    for (int i = 1; i <= m + q; ++i)
    {
        auto [l, r, id] = qr[i];
        if (id)
        {
            ans[id] = (get (1, 1, n, l, r) == l ? "YES\n" : "NO\n");
            continue;
        }
        update (1, 1, n, l, r, l);
    }
    for (int i = 1; i <= q; ++i)
    {
        cout << ans[i];
    }
}

#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...