제출 #1348544

#제출 시각아이디문제언어결과실행 시간메모리
1348544cnam9Joker (BOI20_joker)C++20
0 / 100
2093 ms11544 KiB
#include <iostream>
#include <vector>

using namespace std;

constexpr int N = 2e5;
pair<int, int> edges[N];
int f[N];

struct DSU {
    vector<int> parent;
    vector<char> parity;
    bool bipartite;

    DSU(int n) {
        parent.assign(n, -1);
        parity.assign(n, 0);
        bipartite = true;
    }

    pair<int, bool> find_set(int v) {
        if (parent[v] < 0) return {v, parity[v]};
        pair<int, bool> p = find_set(parent[v]);
        return {parent[v] = p.first, parity[v] ^= p.second};
    }

    void add_edge(int e) {
        auto [u, x] = find_set(edges[e].first);
        auto [v, y] = find_set(edges[e].second);

        if (u == v) {
            if (x == y) bipartite = false;
            return;
        }

        if (parent[u] > parent[v]) swap(u, v);
        parent[u] += parent[v];
        parent[v] = u;

        parity[v] = x ^ y ^ 1;
    }

    inline bool is_bipartite() const {
        return bipartite;
    }
};

void dnc(int l, int r, int fl, int fr, const DSU &dsu) {
    if (l >= r) return;

    int m = l + r + 1 >> 1;

    {
        DSU new_dsu = dsu;
        for (int e = r; e > m; e--) {
            new_dsu.add_edge(e);
        }
        for (f[m] = fl; f[m] < min(fr, m) && new_dsu.is_bipartite(); f[m]++) {
            new_dsu.add_edge(f[m]);
        }
    }

    {
        DSU new_dsu = dsu;
        for (int e = r; e >= m; e--) {
            new_dsu.add_edge(e);
        }
        dnc(l, m - 1, fl, f[m], new_dsu);
    }

    {
        DSU new_dsu = dsu;
        for (int e = fl + 1; e <= f[m]; e++) {
            new_dsu.add_edge(e);
        }
        dnc(m, r, f[m], fr, new_dsu);
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    // freopen("input.txt", "r", stdin);

    int n, m, q;
    cin >> n >> m >> q;

    for (int e = 0; e < m; e++) {
        int u, v;
        cin >> u >> v;
    
        edges[e] = {u - 1, v - 1};        
    }

    dnc(0, m, 0, m, DSU(n));

    while (q--) {
        int l, r;
        cin >> l >> r;
        l--;

        cout << (l >= f[r] ? "YES\n" : "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...