Submission #1054646

#TimeUsernameProblemLanguageResultExecution timeMemory
1054646ssenseJoker (BOI20_joker)C++14
14 / 100
2076 ms144364 KiB
#include <iostream>
#include <algorithm>
#include <vector>
#include <array>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
#include <chrono>
#include <random>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstring>
#include <iomanip>
#include <bitset>
#include <limits.h>
#include <cassert>
 
#define fr first
#define sc second
 
using namespace std;
 
#define int long long

const int N = (2e5)+5;

int p[N], sz[N], col[N];

stack<int> adj[N];

int find(int a)
{
    if(p[a] == a)
    {
        return a;
    }
    return find(p[a]);
}

int add_edge(int a, int b)
{
    int ca = find(a);
    int cb = find(b);
    if(ca == cb)
    {
        if(col[a] == col[b])
        {
            return -1;
        }
        return 1;
    }
    if(sz[ca] < sz[cb])
    {
        swap(a, b);
        swap(ca, cb);
    }
    sz[ca] += sz[cb];
    p[cb] = ca;
    if(col[a] != col[b])
    {
        while(!adj[cb].empty())
        {
            adj[ca].push(adj[cb].top());
            adj[cb].pop();
        }
        return 1;
    }
    while(!adj[cb].empty())
    {
        adj[ca].push(adj[cb].top());
        col[adj[cb].top()] = 1-col[adj[cb].top()];
        adj[cb].pop();
    }
    return 1;
}

void solve()
{
    int n, m, q;
    cin >> n >> m >> q;
    vector<pair<int, int> > e(m+1);
    for(int i = 1; i <= m; i++)
    {
        cin >> e[i].fr >> e[i].sc;
    }
    vector<int> bruh(m+1);
    for(int i = 1; i <= m; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            p[j] = j;
            sz[j] = 1;
            col[j] = 0;
            while(!adj[j].empty())
            {
                adj[j].pop();
            }
            adj[j].push(j);
        }
        int ans = 1;
        // cout << "I : " << i << endl;
        for(int j = 1; j <= i-1; j++)
        {
             ans = min(ans, add_edge(e[j].fr, e[j].sc));
            //cout << e[j].fr << " " << e[j].sc << " " << add_edge(e[j].fr, e[j].sc) << endl;
        }
        // cout << "I: " << i << " " << ans << endl;
        // for(int i = 1; i <= n; i++)
        // {
        //     cout << col[i] << endl;
        // }
        // cout << "FIND 1 " << find(1) << endl;
        // cout << "SZ 1 " << sz[1] << endl;
        if(ans == -1)
        {
            bruh[i] = m;
            continue;
        }
        for(int j = m; j >= i; j--)
        {
            ans = min(ans, add_edge(e[j].fr, e[j].sc));
            if(ans == -1)
            {
                bruh[i] = j-1;
                break;
            }
        }
    }
    // for(int i = 1; i <= m; i++)
    // {
    //     cout << bruh[i] << " ";
    // }
    for(int i = 0; i < q; i++)
    {
        int l, r;
        cin >> l >> r;
        if(r <= bruh[l])
        {
            cout << "YES" << endl;
        }
        else
        {
            cout << "NO" << endl;
        }
    }
}
 
int32_t main()
{
    ios_base::sync_with_stdio(false);cin.tie(0);
    int t = 1;
    while(t--)
    {
        solve();
    }
}
 
/*

*/
 
/*
#include <iostream>
#include <algorithm>
#include <vector>
#include <array>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
#include <chrono>
#include <random>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstring>
#include <iomanip>
#include <bitset>
#include <cassert>
*/
#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...