Submission #1315034

#TimeUsernameProblemLanguageResultExecution timeMemory
1315034thaibaotran555Curtains (NOI23_curtains)C++20
0 / 100
163 ms2164 KiB
///TRAN THAI BAO :3

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

#define maxN 500007

int n, m, q;

typedef pair<int, int> pii;

struct segment
{
    int l, r;
};
segment inp[maxN];
int nxt[maxN] = {0};
int up[maxN][20];
vector<pii>segEnd[maxN];

bool intersect(segment x, segment y)
{
    if(y.l - x.r > 1 || x.l - y.r > 1)
        return false;
    return true;
}

void readData()
{
    cin >> n >> m >> q;
    for(int i = 1; i <= m; i++)
    {
        cin >> inp[i].l >> inp[i].r;
        segEnd[inp[i].l].push_back({inp[i].r, i});
    }
    nxt[0] = 0;
    for(int i = 1; i <= m; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            if(i == j) continue;
            if(inp[j].r <= inp[i].r)
                continue;
            if(intersect(inp[i], inp[j]))
                if(nxt[i] == 0 || inp[nxt[i]].r > inp[j].r)
                    nxt[i] = j;
        }
    }
}

void build()
{
    for(int i = 1; i <= n; i++)
    {
        sort(segEnd[i].begin(), segEnd[i].end());
        up[i][0] = nxt[i];
    }
    for(int i = 1; i < 20; i++)
        for(int j = 0; j <= n; j++)
            up[j][i] = up[up[j][i-1]][i-1];
}

bool query(int u, int v)
{
    int start = 0;
    int lo = 0, hi = segEnd[u].size()-1;
    while(lo <= hi)
    {
        int mid = (lo+hi)/2;
        if(segEnd[u][mid].first <= v)
        {
            start = segEnd[u][mid].second;
            lo = mid+1;
        }
        else hi = mid-1;
    }
    if(start == 0)
        return false;
    for(int i = 19; i >= 0; i--)
        if(up[start][i] != 0 && inp[up[start][i]].r <= v)
            start = up[start][i];
    return inp[start].r == v;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    readData();
    build();
    int u, v;
    while(q--)
    {
        cin >> u >> v;
        if(query(u, v))
            cout << "YES\n";
        else cout << "NO\n";
    }
    return 0;
}
#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...