#define PROB Problema4 #include <iostream> #include <fstream> #include<vector> #include<queue> #include<stack> using namespace std; typedef int var; #define fin cin #define fout cout //ifstream fin("date.in"); //ofstream fout("date.out"); #define MAXN 100005 bool TRUE[MAXN]; var TREE[MAXN]; const var zeros(var val) { return val & (-val); } void update(var ind, var val) { for(;ind<MAXN; ind += zeros(ind)) { TREE[ind] += val; } } bool query(var ind) { var s = 0; for(;ind;ind -= zeros(ind)) { s += TREE[ind]; } return s; } void update_int(var b, var e, var delta) { update(b, delta); update(e+1, -delta); } var PARENT[MAXN], RANK[MAXN], T[MAXN]; var INIT[MAXN]; var TIMES[MAXN]; var Find(var a) { if(PARENT[a] == 0 || query(T[a]) <= 0) { return a; } return Find(PARENT[a]); } var Union(var r1, var r2, var t) { if(RANK[r1] < RANK[r2]) { PARENT[r1] = r2; T[r1] = t; } else { PARENT[r2] = r1; T[r2] = t; if(RANK[r1] == RANK[r2]) { RANK[r1] ++; } } } int main() { var n, m, a, timp = 0, time_index = 0, b, type; fin>>n>>m; while(m--) { fin>>type; if(type == 1) { fin>>a>>b; timp++; update_int(timp, timp, 1); ++time_index; TIMES[time_index] = timp; if(query(INIT[a]) == 0) { INIT[a] = timp; } if(query(INIT[b]) == 0) { INIT[b] = timp; } var r1 = Find(a), r2 = Find(b); if(r1 != r2) { Union(r1, r2, timp); } } else if(type == 2) { fin>>a; var it = 0; time_index -= a; update_int(TIMES[time_index]+1, timp, -1); } else { fin>>a>>b; if(a == b) { if(query(INIT[a]) <= 0) { fout<<"0\n"; } else { fout<<"1\n"; } } else { fout<<(Find(a) == Find(b))<<'\n'; } } } }