제출 #1207777

#제출 시각아이디문제언어결과실행 시간메모리
1207777pudelosJoker (BOI20_joker)C++20
0 / 100
0 ms320 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<pair<int, 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) {
      if((odl(aq)^odl(bq))==0) {
        secik.insert(id);
        stosik.pb({-1, {id, 0}});
      } else {
        stosik.pb({-1, {id, 0}});
      }
      return;
    }
    if(sajs[a]<sajs[b]) swap(a, b);

    int oldas = sajs[a];
    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, oldas}});
  }

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

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

void rozw(int l1, int l2, int r1, int r2) {
  if(l1>l2) return;
  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, max(mid, r1)) {
      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, max(w, r1), r2);
  AF.rollback();

  FORB(i, mid-1, l1) AF.rollback();
  FORB(i, r2, max(w+1, r1)) AF.uu(i);
  rozw(l1, mid, r1, min(w, r2));
  FOR(i, max(w+1, r1), 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();
  FOR(i, 1, m) AF.uu(i);
  if(!AF.cykl_np()) {
    FOR(i, 1, q) cout << "NIE\n";
    exit(0);
  }
  FOR(i, 1, m) AF.rollback();
  rozw(1, m, 1, m);

  FOR(i, 1, q) {
    cin >> a >> b;
    if(b<=dp[a]) cout << "TAK\n";
    else cout << "NIE\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...