Submission #1207629

#TimeUsernameProblemLanguageResultExecution timeMemory
1207629pudelosJoker (BOI20_joker)C++20
0 / 100
2095 ms24996 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define FOR(i, a, b) for(int i=a; i<=b; ++i)
#define FORB(i, a, b) for(int i=a; i>=b; --i)
#define sz(A) (int)(A.size())
#define eb emplace_back
#define pb push_back
#define ll long long
#define pi pair<int, int>
#define f first
#define s second
#define rs resize
#define V vector

int n, m, q;
V<pi> kraw;
V<int> dp;

struct Fu {
  V<int> rep, A, sajs;
  set<int> secik;
  V<pi> stosik;
  void init() {
    rep.rs(n+1);
    A.rs(n+1);
    sajs.rs(n+1);
    FOR(i, 1, n) {
      rep[i]=i;
      sajs[i]=1;
    }
  }

  int ff(int x) {
    if(rep[x]==x) return x;
    return ff(rep[x]);
  }

  int odl(int x) {
    int sum=0;
    while(rep[x]!=x) sum^=A[x], x=rep[x];
    sum^=A[x];
    return sum;
  }

  void uu(int id) {
    auto [aq, bq] = kraw[id];
    int a=ff(aq);
    int b=ff(bq);
    if(a==b) {
      secik.insert(id);
      stosik.pb({-1, id});
      return;
    }
    if(sajs[a]<sajs[b]) swap(a, b);

    rep[b]=a;
    sajs[a]+=sajs[b];
    int zmiana=0;
    if((odl(aq)^odl(bq))==0) A[b]^=1, zmiana=1;
    stosik.pb({b, zmiana});
  }

  void rollback() {
    auto [a, b] = stosik.back();
    stosik.pop_back();
    if(a==-1) {
      secik.erase(b);
      return;
    }
    sajs[rep[a]]-=sajs[a];
    rep[a]=a;
    A[a]^=b;
  }

  bool cykl_np() {
    return (sz(secik)>=1);
  }
} AF;

void rozw(int l1, int l2, int r1, int r2) {
  int mid = (l1+l2)/2;
  FOR(i, l1, mid-1) AF.uu(i);
  int w=-1;
  if(AF.cykl_np()) w=r2;
  else {
    int ile=0;
    FORB(i, r2, mid+1) {
      AF.uu(i);
      ++ile;
      if(AF.cykl_np()) {
        w=i-1;
        break;
      }
    }
    FOR(i, 1, ile) AF.rollback();
  }
  if(l1==l2) {
    FORB(i, mid-1, l1) AF.rollback();
    dp[l1]=w;
    return;
  }
  AF.uu(mid);
  rozw(mid+1, l2, w, r2);
  AF.rollback();

  FORB(i, mid-1, l1) AF.rollback();
  FORB(i, r2, w+1) AF.uu(i);
  rozw(l1, mid, r1, w);
  FOR(i, w+1, r2) AF.rollback();
}

signed main() {
  cin.tie(0) -> ios_base::sync_with_stdio(0);
  cin >> n >> m >> q;
  kraw.rs(m+1);
  dp.rs(m+1);
  int a, b;
  FOR(i, 1, m) {
    cin >> a >> b;
    kraw[i]={a, b};
  }

  AF.init();
  rozw(1, m, 1, m);

  FOR(i, 1, q) {
    cin >> a >> b;
    // check
    if(b<=dp[a]) cout << "YES\n";
    else cout << "NO\n";
  }
}
#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...