Submission #102478


Source Code Expand

#include <iostream>
#include <algorithm>
#include <vector>
#include <map>


#define FOR(i, a, n) for(int i = (a); i < (n); i++)
#define REP(i, n) FOR(i, 0, n)
#define RFOR(i, a, n) for(int i = (n) - 1; i >= (a); i--)
#define RREP(i, n) RFOR(i, 0, n)
#define fst first
#define snd second

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int MAX_N = 110000;
const int MAX_M = 110000;
const int MAX_K = 110000;

int n, m, k;
vector<int> g[MAX_N];
pii es[MAX_M];
bool deleted[MAX_N];

int t[MAX_K], a1[MAX_K], a2[MAX_K];

struct UnionFind{
  
  int n;
  vector<int> par, rank;
  

  UnionFind(int n_){
	n = n_;
	par = vector<int>(n);
	rank = vector<int>(n);
	REP(i, n){
	  par[i] = i;
	  rank[i] = 0;
	}
  }
  

  int find(int x){
	return (x == par[x]) ? x : par[x] = find(par[x]);
  }

 void unite(int x, int y){
   x = find(x);
   y = find(y);
   if(x == y) return;
   if(rank[x] < rank[y]){
	 par[x] = y;
   }else{
	 par[y] = x;
	 if(rank[x] == rank[y]) rank[x]++;
   }
 }

  bool same(int x, int y){
	return find(x) == find(y);
  }
  
};

vector<bool> solve(){
  vector<bool> r;

  UnionFind uf(n);
  REP(i, m){
	if(!deleted[i]){
	  g[es[i].fst].push_back(es[i].snd);
	  g[es[i].snd].push_back(es[i].fst);
	  uf.unite(es[i].fst, es[i].snd);
	}
  }

  RREP(i, k){
	if(t[i] == 0){
	  k = a1[i];
	  g[es[k].fst].push_back(es[k].snd);
	  g[es[k].snd].push_back(es[k].fst);
	  uf.unite(es[k].fst, es[k].snd);
	}else{
	  r.push_back(uf.same(a1[i], a2[i]));
	}
  }
  
  reverse(r.begin(), r.end());
  return r;
}

int main(){
  cin >> n >> m >> k;
  REP(i, n) g[i].clear();
  REP(i, m){
	cin >> es[i].fst >> es[i].snd;
	es[i].fst--, es[i].snd--;
  }
  REP(i, k){
	cin >> t[i];
	if(t[i] == 0){
	  cin >> a1[i];
	  a1[i]--;
	  deleted[a1[i]] = true;
	}else{
	  cin >> a1[i] >> a2[i];
	  a1[i]--, a2[i]--;
	}
  }
  
  vector<bool> r = solve();
  REP(i, (int)r.size()){
	cout << (r[i] ? "YES" : "NO") << endl;
  }
  return 0;
}

Submission Info

Submission Time
Task D - Graph Destruction
User torimal
Language C++ (GCC 4.4.7)
Score 100
Code Size 2068 Byte
Status AC
Exec Time 589 ms
Memory 9372 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 27 ms 4132 KB
10 AC 36 ms 4260 KB
11 AC 73 ms 4384 KB
12 AC 169 ms 4908 KB
13 AC 309 ms 5536 KB
14 AC 451 ms 6420 KB
15 AC 512 ms 7860 KB
16 AC 589 ms 9372 KB
17 AC 171 ms 5164 KB
18 AC 165 ms 5160 KB
19 AC 202 ms 5548 KB
2 AC 26 ms 4256 KB
20 AC 278 ms 5876 KB
21 AC 201 ms 5536 KB
22 AC 275 ms 5920 KB
23 AC 208 ms 5420 KB
24 AC 141 ms 5028 KB
25 AC 162 ms 5156 KB
26 AC 408 ms 6812 KB
27 AC 139 ms 5024 KB
28 AC 152 ms 5028 KB
29 AC 326 ms 6056 KB
3 AC 27 ms 4140 KB
30 AC 243 ms 5544 KB
31 AC 409 ms 6556 KB
32 AC 324 ms 6176 KB
33 AC 347 ms 6308 KB
34 AC 414 ms 6884 KB
35 AC 371 ms 6304 KB
36 AC 182 ms 5276 KB
4 AC 26 ms 4124 KB
5 AC 26 ms 4124 KB
50 AC 396 ms 6564 KB
6 AC 28 ms 4192 KB
7 AC 30 ms 4260 KB
8 AC 31 ms 4264 KB
9 AC 33 ms 4256 KB