-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
#include "grader.h"
#include <bits/stdc++.h>
#define par first
#define sz second
using namespace std;
using ii = pair<int, int>;
constexpr int INF = 2e9;
int cnt;
unordered_map<string, int> s;
vector<pair<int, ii>> m[200002];
inline void alloc(string cow) { if (s.find(cow) == end(s)) s[cow] = ++cnt, m[cnt].emplace_back(0, ii(cnt, 1)); }
inline ii & get(int i, int timestamp) { return prev(upper_bound(begin(m[i]), end(m[i]), make_pair(timestamp, ii(INF, 0))))->second; }
int find_set(int i, int timestamp) {
int & p = get(i, timestamp).par;
return (p == i) ? i : (p = find_set(p, timestamp));
}
void add_friend(string cow1, string cow2, int timestamp) {
alloc(cow1), alloc(cow2);
int i = find_set(s[cow1], timestamp), j = find_set(s[cow2], timestamp);
if (i == j) return;
ii x = get(i, timestamp), y = get(j, timestamp);
if (x.sz < y.sz) swap(i, j);
m[i].emplace_back(timestamp, ii(i, x.sz + y.sz)), m[j].emplace_back(timestamp, ii(i, 0));
}
bool check_friend(string cow1, string cow2, int timestamp) {
alloc(cow1), alloc(cow2);
return find_set(s[cow1], timestamp) == find_set(s[cow2], timestamp);
}
int get_number_of_friends(string cow, int timestamp) {
alloc(cow);
return get(find_set(s[cow], timestamp), timestamp).sz;
}