제출 #726677

#제출 시각아이디문제언어결과실행 시간메모리
726677JohannJoker (BOI20_joker)C++14
39 / 100
2058 ms39224 KiB
#include "bits/stdc++.h"
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<pii> vpii;
typedef vector<vpii> vvpii;
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()

int N, M, Q;
vvpii adj;
vpii E;

struct DSU
{
    vi arr;
    vi color;
    vvi contains;
    bool oddCycle;
    void init()
    {
        oddCycle = false;
        arr.resize(N);
        iota(all(arr), 0);
        color.assign(N, 0);
        contains.resize(N);
        for (int i = 0; i < N; ++i)
            contains[i].clear(), contains[i].push_back(i);
    }
    int find(int i)
    {
        return arr[i] = (arr[i] == i) ? i : find(arr[i]);
    }
    bool join(int a, int b)
    {
        bool sameColor = (color[a] == color[b]);
        a = find(a), b = find(b);
        if (a == b)
        {
            oddCycle = oddCycle || sameColor;
            return sameColor;
        }
        if (sz(contains[a]) < sz(contains[b]))
            swap(a, b);
        arr[b] = a;
        while (!contains[b].empty())
        {
            int u = contains[b].back();
            contains[b].pop_back();
            contains[a].push_back(u);
            if (sameColor)
                color[u] = !color[u];
        }
        return false;
    }
};

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> N >> M >> Q;
    adj.resize(N);
    E.resize(M);
    for (int i = 0, a, b; i < M; ++i)
    {
        cin >> a >> b;
        --a, --b;
        adj[a].push_back({b, i}), adj[b].push_back({a, i});
        E[i] = {min(a, b), max(a, b)};
    }

    vvpii Queries(M + 1);
    vi ans(Q);
    for (int i = 0, l, r; i < Q; ++i)
    {
        cin >> l >> r;
        --l, --r; // [l, r] inclusive is blocked
        l = min(M, l), r = min(M, r);
        Queries[l].push_back({r, i});
    }

    DSU dsu;
    for (int l = 0; l < sz(Queries); ++l)
    {
        if (Queries[l].empty())
            continue;
        dsu.init();

        for (int i = 0; i < l; ++i)
            dsu.join(E[i].first, E[i].second);
        int r = M - 1;
        while (!dsu.oddCycle && r >= l)
        {
            dsu.join(E[r].first, E[r].second);
            --r;
        }
        for (pii q : Queries[l])
            ans[q.second] = (q.first <= r);
    }

    for (int a : ans)
        if (a)
            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...