Submission #486901


Source Code Expand

/*
 * d.cc: D: 
 */

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<deque>
#include<algorithm>
#include<numeric>
#include<utility>
#include<complex>
#include<functional>
 
using namespace std;

/* constant */

const int MAX_N = 100000;
const int MAX_M = 100000;
const int MAX_K = 100000;

/* typedef */

struct UFT {
  int links[MAX_N], ranks[MAX_N], sizes[MAX_N];
  
  UFT() {}

  void clear(int n) {
    for (int i = 0; i < n; i++)
      links[i] = i, ranks[i] = sizes[i] = 1;
  }

  int root(int i) {
    int i0 = i;
    while (links[i0] != i0) i0 = links[i0];
    return (links[i] = i0);
  }

  int rank(int i) { return ranks[root(i)]; }
  int size(int i) { return sizes[root(i)]; }
  bool same(int i, int j) { return root(i) == root(j); }

  int merge(int i0, int i1) {
    int r0 = root(i0), r1 = root(i1);
    int mr;
    if (ranks[r0] == ranks[r1]) {
      links[r1] = r0;
      sizes[r0] += sizes[r1];
      ranks[r0]++;
      mr = r0;
    }
    else if (ranks[r0] > ranks[r1]) {
      links[r1] = r0;
      sizes[r0] += sizes[r1];
      mr = r0;
    }
    else {
      links[r0] = r1;
      sizes[r1] += sizes[r0];
      mr = r1;
    }
    return mr;
  }
};

struct Edge {
  int a, b;
  bool f;
};

struct Query {
  int op, a, b;
};

/* global variables */

UFT uft;
Edge es[MAX_M];
Query qs[MAX_K];
stack<bool> ans;

/* subroutines */

/* main */

int main() {
  int n, m, k;
  cin >> n >> m >> k;

  for (int i = 0; i < m; i++) {
    cin >> es[i].a >> es[i].b;
    es[i].a--, es[i].b--, es[i].f = true;
  }

  for (int i = 0; i < k; i++) {
    cin >> qs[i].op;
    if (qs[i].op == 0) {
      int j;
      cin >> j;
      j--;
      qs[i].a = es[j].a;
      qs[i].b = es[j].b;
      es[j].f = false;
    }
    else {
      cin >> qs[i].a >> qs[i].b;
      qs[i].a--, qs[i].b--;
    }
  }

  uft.clear(n);
  
  for (int i = 0; i < m; i++)
    if (es[i].f) {
      int ra = uft.root(es[i].a);
      int rb = uft.root(es[i].b);
      if (ra != rb) uft.merge(ra, rb);
    }

  for (int i = k - 1; i >= 0; i--) {
    int ra = uft.root(qs[i].a);
    int rb = uft.root(qs[i].b);
    if (qs[i].op == 0) {
      if (ra != rb) uft.merge(ra, rb);
    }
    else {
      ans.push(ra == rb);
    }
  }

  while (! ans.empty()) {
    bool f = ans.top(); ans.pop();
    cout << (f ? "YES" : "NO") << endl;
  }

  return 0;
}

Submission Info

Submission Time
Task D - Graph Destruction
User tnakao
Language C++ (GCC 4.4.7)
Score 100
Code Size 2628 Byte
Status AC
Exec Time 454 ms
Memory 5372 KB

Judge Result

Set Name All
Score / Max Score 100 / 100
Status
AC × 37
Set Name Test Cases
All 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 3, 30, 31, 32, 33, 34, 35, 36, 4, 5, 50, 6, 7, 8, 9
Case Name Status Exec Time Memory
1 AC 39 ms 1744 KB
10 AC 44 ms 1764 KB
11 AC 74 ms 2044 KB
12 AC 148 ms 2424 KB
13 AC 245 ms 2928 KB
14 AC 350 ms 3448 KB
15 AC 403 ms 4476 KB
16 AC 454 ms 5372 KB
17 AC 146 ms 2552 KB
18 AC 138 ms 2552 KB
19 AC 176 ms 2808 KB
2 AC 34 ms 1784 KB
20 AC 231 ms 3192 KB
21 AC 177 ms 2808 KB
22 AC 319 ms 3148 KB
23 AC 175 ms 2812 KB
24 AC 259 ms 2512 KB
25 AC 139 ms 2556 KB
26 AC 337 ms 3832 KB
27 AC 121 ms 2428 KB
28 AC 133 ms 2424 KB
29 AC 268 ms 3316 KB
3 AC 35 ms 1912 KB
30 AC 198 ms 2936 KB
31 AC 321 ms 3708 KB
32 AC 262 ms 3320 KB
33 AC 283 ms 3448 KB
34 AC 343 ms 3836 KB
35 AC 303 ms 3572 KB
36 AC 158 ms 2684 KB
4 AC 35 ms 1784 KB
5 AC 35 ms 1784 KB
50 AC 319 ms 3700 KB
6 AC 33 ms 1784 KB
7 AC 36 ms 1788 KB
8 AC 37 ms 1788 KB
9 AC 38 ms 1784 KB