#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
const int MX_N = 1e5 + 5;
const int MX_DAYS = 2e5 + 5;
const int MX_NODES = (MX_N + MX_DAYS) * 30;
int idd;
int ppl;
int h[MX_N];
map<int, int> to;
set<pair<int, int>> friends;
vector<pair<int, int>> versions[MX_N];
int tree[MX_NODES];
int root[MX_NODES];
int L[MX_NODES], R[MX_NODES];
int upd (int nd, int l, int r, int p, int v) {
int nx = ++idd;
if (l == r) {
tree[nx] = tree[nd] + v;
return nx;
}
int mid = (l + r) >> 1;
if (p <= mid) {
L[nx] = upd(L[nd], l, mid, p, v);
R[nx] = R[nd];
} else {
L[nx] = L[nd];
R[nx] = upd(R[nd], mid + 1, r, p, v);
}
tree[nx] = tree[L[nx]] + tree[R[nx]];
return nx;
}
void dive (int nd, int l, int r, vector<int>& vec) {
if (l == r) {
vec.push_back(l);
return;
}
int mid = (l + r) >> 1;
if (L[nd] && tree[L[nd]]) {
dive(L[nd], l, mid, vec);
}
if (R[nd] && tree[R[nd]]) {
dive(R[nd], mid + 1, r, vec);
}
}
pair<int, int> invert (int u, int v, int uVersion, int vVersion) {
int rootU, rootV;
if (friends.count({u, v})) {
rootU = upd(uVersion, 0, ppl - 1, h[v], -1);
rootV = upd(vVersion, 0, ppl - 1, h[u], -1);
friends.erase({u, v});
} else {
rootU = upd(uVersion, 0, ppl - 1, h[v], +1);
rootV = upd(vVersion, 0, ppl - 1, h[u], +1);
friends.emplace(u, v);
}
return make_pair(rootU, rootV);
}
void compress () {
map<int, int> mp;
int cnt = 0;
for (int i = 0; i < ppl; ++i) {
mp[h[i]];
}
for (auto& it : mp) {
it.second = cnt++;
}
for (int i = 0; i < ppl; ++i) {
to[mp[h[i]]] = h[i];
h[i] = mp[h[i]];
}
}
void init(int N, int D, int H[]) {
ppl = N;
for (int i = 0; i < ppl; ++i) {
h[i] = H[i];
versions[i].emplace_back(0, ++idd);
}
compress();
}
void curseChanges(int U, int A[], int B[]) {
for (int day = 1; day <= U; ++day) {
int u = A[day - 1], v = B[day - 1];
if (u > v) swap(u, v);
int verU = versions[u].back().second;
int verV = versions[v].back().second;
auto [ru, rv] = invert(u, v, verU, verV);
versions[u].emplace_back(day, ru);
versions[v].emplace_back(day, rv);
}
}
int getDis (vector<int> h1, vector<int> h2) {
if (h1.empty() || h2.empty()) {
return INF;
}
int ret = INF;
int i = 0, j = 0;
int n = h1.size(), m = h2.size();
while (i < n || j < m) {
if (i < n && (j == m || h1[i] < h2[j])) {
if (j < m) {
ret = min(ret, to[h2[j]] - to[h1[i]]);
}
i++;
} else {
if (i < n) {
ret = min(ret, to[h1[i]] - to[h2[j]]);
}
j++;
}
}
return ret;
}
int question(int u, int v, int day) {//p1, p2, day
pair<int,int> verV = *prev(lower_bound(versions[v].begin(), versions[v].end(), make_pair(day, INF)));
pair<int,int> verU = *prev(lower_bound(versions[u].begin(), versions[u].end(), make_pair(day, INF)));
vector<int> h1, h2;
dive(verV.second, 0, ppl - 1, h1);
dive(verU.second, 0, ppl - 1, h2);
//cout << "U, V: " << u << ' ' << v << '\n';
//cout << "VALS OF U'S FRIENDS: ";
//for (int i : h1) {
//cout << to[i] << ' ';
//}
//cout << '\n';
//cout << "VALS OF V'S FRIENDS: ";
//for (int i : h2) {
//cout << to[i] << ' ';
//}
//cout << '\n';
return getDis(h1, h2);
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
2640 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
3 ms |
3108 KB |
Output is correct |
2 |
Correct |
3 ms |
3024 KB |
Output is correct |
3 |
Correct |
5 ms |
3004 KB |
Output is correct |
4 |
Correct |
118 ms |
16324 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
807 ms |
109608 KB |
Output is correct |
2 |
Correct |
839 ms |
109596 KB |
Output is correct |
3 |
Correct |
546 ms |
99980 KB |
Output is correct |
4 |
Execution timed out |
3023 ms |
64652 KB |
Time limit exceeded |
5 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
471 ms |
106480 KB |
Output is correct |
2 |
Correct |
275 ms |
97636 KB |
Output is correct |
3 |
Correct |
367 ms |
99328 KB |
Output is correct |
4 |
Correct |
364 ms |
99152 KB |
Output is correct |
5 |
Correct |
459 ms |
106104 KB |
Output is correct |
6 |
Correct |
360 ms |
99280 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
82 ms |
7588 KB |
Output is correct |
2 |
Correct |
223 ms |
7376 KB |
Output is correct |
3 |
Correct |
421 ms |
7316 KB |
Output is correct |
4 |
Correct |
2944 ms |
7484 KB |
Output is correct |
5 |
Correct |
2572 ms |
7648 KB |
Output is correct |
6 |
Correct |
285 ms |
6124 KB |
Output is correct |
7 |
Correct |
2344 ms |
7324 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
2640 KB |
Output is correct |
2 |
Correct |
3 ms |
3108 KB |
Output is correct |
3 |
Correct |
3 ms |
3024 KB |
Output is correct |
4 |
Correct |
5 ms |
3004 KB |
Output is correct |
5 |
Correct |
118 ms |
16324 KB |
Output is correct |
6 |
Correct |
807 ms |
109608 KB |
Output is correct |
7 |
Correct |
839 ms |
109596 KB |
Output is correct |
8 |
Correct |
546 ms |
99980 KB |
Output is correct |
9 |
Execution timed out |
3023 ms |
64652 KB |
Time limit exceeded |
10 |
Halted |
0 ms |
0 KB |
- |