Submission #1124230

#TimeUsernameProblemLanguageResultExecution timeMemory
1124230seoul_koreaCurtains (NOI23_curtains)C++17
100 / 100
1114 ms59832 KiB
#include <bits/stdc++.h>

using namespace std;

#define TASK "curtains"
#define REP(i, n) for(int i = 1; i <= n; i++)
#define FOR(i, a, b) for(auto i = a; i <= b; i++)
#define FORD(i, a, b) for(auto i = a; i >= b; i--)
template<class T> bool maximize(T& a, T b) { if(a < b) return a = b, 1; return 0; }
template<class T> bool minimize(T& a, T b) { if(a > b) return a = b, 1; return 0; }

const int N = (int)5e5 + 7;
int n, m, q;
vector<array<int, 2>> query[N];
vector<int> adj[N];
int node[N * 4][2];
bool ans[N];

void Down(int id)
{
    if(node[id][1])
    {
        maximize(node[id << 1][0], node[id][1]);
        maximize(node[id << 1][1], node[id][1]);
        maximize(node[id << 1 | 1][0], node[id][1]);
        maximize(node[id << 1 | 1][1], node[id][1]);
        node[id][1] = 0;
    }
}

void Upd(int id, int l, int r, int u, int v, int val)
{
    if(u > r || v < l)
        return;
    if(u <= l && r <= v)
    {
        maximize(node[id][0], val);
        maximize(node[id][1], val);
        return;
    }
    Down(id);
    int m = l + r >> 1;
    Upd(id << 1, l, m, u, v, val);
    Upd(id << 1 | 1, m + 1, r, u, v, val);
    node[id][0] = min(node[id << 1][0], node[id << 1 | 1][0]);
}

void Upd(int l, int r, int val)
{
    return Upd(1, 1, n, l, r, val);
}

int Get(int id, int l, int r, int u, int v)
{
    if(u > r || v < l)
        return n + 1;
    if(u <= l && r <= v)
        return node[id][0];
    Down(id);
    int m = l + r >> 1;
    return min(Get(id << 1, l, m, u, v), Get(id << 1 | 1, m + 1, r, u, v));
}

int Get(int l, int r)
{
    return Get(1, 1, n, l, r);
}

signed main()
{
    cin.tie(0)->ios_base::sync_with_stdio(0);

    if(fopen("TASK.INP", "r")) freopen("TASK.INP", "r", stdin);
    if(fopen(TASK".INP", "r")) {
        freopen(TASK".INP", "r", stdin);
        freopen(TASK".OUT", "w", stdout);
    }

    cin >> n >> m >> q;
    REP(i, m)
    {
        int u, v;
        cin >> u >> v;
        adj[v].push_back(u);
    }
    REP(i, q)
    {
        int l, r;
        cin >> l >> r;
        query[r].push_back({l, i});
    }
    REP(i, n)
    {
        for(int l : adj[i])
            Upd(l, i, l);
        for(array<int, 2> qu : query[i])
        {
            int l = qu[0];
            int id = qu[1];
            if(Get(l, i) == l)
                ans[id] = 1;
        }
    }
    REP(i, q)
        cout << (ans[i] ? "YES" : "NO") << '\n';
    return 0;
}

Compilation message (stderr)

curtains.cpp: In function 'int main()':
curtains.cpp:73:39: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   73 |     if(fopen("TASK.INP", "r")) freopen("TASK.INP", "r", stdin);
      |                                ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
curtains.cpp:75:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   75 |         freopen(TASK".INP", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
curtains.cpp:76:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   76 |         freopen(TASK".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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...