This documentation is automatically generated by online-judge-tools/verification-helper
#include "structure/union-find/partially-persistent-union-find.hpp"
struct PartiallyPersistentUnionFind {
vector<int> data;
vector<int> last;
vector<vector<pair<int, int> > > add;
PartiallyPersistentUnionFind() {}
PartiallyPersistentUnionFind(int sz) : data(sz, -1), last(sz, 1e9), add(sz) {
for (auto &vs : add) vs.emplace_back(-1, -1);
}
bool unite(int t, int x, int y) {
x = find(t, x);
y = find(t, y);
if (x == y) return false;
if (data[x] > data[y]) swap(x, y);
data[x] += data[y];
add[x].emplace_back(t, data[x]);
data[y] = x;
last[y] = t;
return true;
}
int find(int t, int x) {
if (t < last[x]) return x;
return find(t, data[x]);
}
int size(int t, int x) {
x = find(t, x);
return -prev(lower_bound(begin(add[x]), end(add[x]), make_pair(t, 0)))
->second;
}
};
#line 1 "structure/union-find/partially-persistent-union-find.hpp"
struct PartiallyPersistentUnionFind {
vector<int> data;
vector<int> last;
vector<vector<pair<int, int> > > add;
PartiallyPersistentUnionFind() {}
PartiallyPersistentUnionFind(int sz) : data(sz, -1), last(sz, 1e9), add(sz) {
for (auto &vs : add) vs.emplace_back(-1, -1);
}
bool unite(int t, int x, int y) {
x = find(t, x);
y = find(t, y);
if (x == y) return false;
if (data[x] > data[y]) swap(x, y);
data[x] += data[y];
add[x].emplace_back(t, data[x]);
data[y] = x;
last[y] = t;
return true;
}
int find(int t, int x) {
if (t < last[x]) return x;
return find(t, data[x]);
}
int size(int t, int x) {
x = find(t, x);
return -prev(lower_bound(begin(add[x]), end(add[x]), make_pair(t, 0)))
->second;
}
};