#include "werewolf.h"
#include <bits/stdc++.h>
#define eb emplace_back
#define sz(V) ((int)(V).size())
#define allv(V) ((V).begin()),((V).end())
#define sorv(V) sort(allv(V))
#define rb(x) ((x)&(-(x)))
using namespace std;
const int MAXN = 200055;
const int MAXM = 400055;
const int MAXQ = 200055;
struct TRE {
vector<int> G[MAXN];
int prt[18][MAXN], cnt[MAXN], dfo[MAXN];
int N, Rt;
void add(int p, int v) { G[p].eb(v); }
void dfs(int i, int &c) {
cnt[i] = 1; dfo[i] = c++;
for(int v : G[i]) {
prt[0][v] = i;
dfs(v, c);
cnt[i] += cnt[v];
}
}
void run() {
prt[0][Rt] = N;
for(int i = 18; i--;) prt[i][N] = N;
{ int _ = 0; dfs(Rt, _); }
for(int j = 1; j < 18; j++) for(int i = 0; i < N; i++)
prt[j][i] = prt[j-1][prt[j-1][i]];
}
} TA, TB;
struct BIT {
int d[MAXN];
void upd(int x) {
for(x += 5; x < MAXN; x += rb(x)) d[x]++;
}
int get(int x) {
int r = 0; for(x += 5; x; x -= rb(x))
r += d[x];
return r;
}
} bit;
struct EVT {
EVT(int idx, int x, int y, bool inv)
: idx(idx), x(x), y(y), inv(inv) {}
int idx, x, y;
bool inv;
bool operator < (const EVT &t) const {
if(x != t.x) return x < t.x;
return idx < t.idx;
}
};
vector<EVT> EV;
vector<int> G[MAXN];
int ud[MAXN];
int A[MAXM], B[MAXM];
int CS[MAXQ], CE[MAXQ], L[MAXQ], R[MAXQ];
int Ans[MAXQ];
int N, M, Q;
int uf(int i) { return i == ud[i] ? i : (ud[i] = uf(ud[i])); }
void uf(int a, int b) { ud[uf(b)] = uf(a); }
int getMx(int v, int c) {
for(int i = 18, p; i--;) {
p = TA.prt[i][v];
if(p <= c) v = p;
}
return v;
}
int getMn(int v, int c) {
for(int i = 18, p; i--;) {
p = TB.prt[i][v];
if(c <= p && p < N) v = p;
}
return v;
}
void getAns() {
for(int i = 0, a, b; i < M; i++) {
a = A[i]; b = B[i];
G[a].eb(b); G[b].eb(a);
}
TA.N = TB.N = N; TA.Rt = N-1;
iota(ud, ud+N, 0);
for(int i = 1; i < N; i++) for(int v : G[i]) {
if(i < v) continue;
v = uf(v);
if(v != i) TA.add(i, v);
uf(i, v);
}
iota(ud, ud+N, 0);
for(int i = N; i--;) for(int v : G[i]) {
if(v < i) continue;
v = uf(v);
if(v != i) TB.add(i, uf(v));
uf(i, v);
}
TA.run(); TB.run();
for(int i = 0; i < N; i++)
EV.eb(-1, TA.dfo[i], TB.dfo[i], false);
for(int i = 0, a, b; i < Q; i++) {
a = getMx(CE[i], R[i]);
b = getMn(CS[i], L[i]);
EV.eb(i, TA.dfo[a]-1, TB.dfo[b]-1, true);
EV.eb(i, TA.dfo[a]-1, TB.dfo[b]+TB.cnt[b]-1, false);
a = TA.dfo[a]+TA.cnt[a]-1;
EV.eb(i, a, TB.dfo[b]-1, false);
EV.eb(i, a, TB.dfo[b]+TB.cnt[b]-1, true);
}
sorv(EV);
for(auto &ev : EV) {
if(ev.idx < 0) bit.upd(ev.y);
else Ans[ev.idx] += bit.get(ev.y) * (ev.inv ? -1 : 1);
}
}
std::vector<int> check_validity(int N, std::vector<int> X, std::vector<int> Y,
std::vector<int> S, std::vector<int> E,
std::vector<int> L, std::vector<int> R) {
::N = N; ::M = sz(X); ::Q = sz(S);
for(int i = 0; i < M; i++) { ::A[i] = X[i]; ::B[i] = Y[i]; }
for(int i = 0; i < Q; i++) {
::CS[i] = S[i]; ::CE[i] = E[i];
::L[i] = L[i]; ::R[i] = R[i];
}
getAns();
vector<int> V;
for(int i = 0; i < Q; i++) V.eb(!!Ans[i]);
return V;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
16 ms |
14848 KB |
Output is correct |
2 |
Correct |
17 ms |
14720 KB |
Output is correct |
3 |
Correct |
18 ms |
14848 KB |
Output is correct |
4 |
Correct |
16 ms |
14720 KB |
Output is correct |
5 |
Correct |
16 ms |
14848 KB |
Output is correct |
6 |
Correct |
18 ms |
14848 KB |
Output is correct |
7 |
Correct |
15 ms |
14840 KB |
Output is correct |
8 |
Correct |
16 ms |
14720 KB |
Output is correct |
9 |
Correct |
16 ms |
14848 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
16 ms |
14848 KB |
Output is correct |
2 |
Correct |
17 ms |
14720 KB |
Output is correct |
3 |
Correct |
18 ms |
14848 KB |
Output is correct |
4 |
Correct |
16 ms |
14720 KB |
Output is correct |
5 |
Correct |
16 ms |
14848 KB |
Output is correct |
6 |
Correct |
18 ms |
14848 KB |
Output is correct |
7 |
Correct |
15 ms |
14840 KB |
Output is correct |
8 |
Correct |
16 ms |
14720 KB |
Output is correct |
9 |
Correct |
16 ms |
14848 KB |
Output is correct |
10 |
Correct |
24 ms |
16248 KB |
Output is correct |
11 |
Correct |
26 ms |
16252 KB |
Output is correct |
12 |
Correct |
25 ms |
16128 KB |
Output is correct |
13 |
Correct |
24 ms |
16232 KB |
Output is correct |
14 |
Correct |
26 ms |
16376 KB |
Output is correct |
15 |
Correct |
27 ms |
16372 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1210 ms |
102880 KB |
Output is correct |
2 |
Correct |
1262 ms |
105344 KB |
Output is correct |
3 |
Correct |
1107 ms |
103628 KB |
Output is correct |
4 |
Correct |
1174 ms |
103088 KB |
Output is correct |
5 |
Correct |
1165 ms |
102836 KB |
Output is correct |
6 |
Correct |
1258 ms |
102924 KB |
Output is correct |
7 |
Correct |
1360 ms |
102872 KB |
Output is correct |
8 |
Correct |
1115 ms |
105284 KB |
Output is correct |
9 |
Correct |
828 ms |
103724 KB |
Output is correct |
10 |
Correct |
922 ms |
103028 KB |
Output is correct |
11 |
Correct |
1050 ms |
102960 KB |
Output is correct |
12 |
Correct |
1066 ms |
102948 KB |
Output is correct |
13 |
Correct |
1946 ms |
110312 KB |
Output is correct |
14 |
Correct |
1744 ms |
110276 KB |
Output is correct |
15 |
Correct |
1747 ms |
110356 KB |
Output is correct |
16 |
Correct |
1765 ms |
110300 KB |
Output is correct |
17 |
Correct |
1158 ms |
102852 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
16 ms |
14848 KB |
Output is correct |
2 |
Correct |
17 ms |
14720 KB |
Output is correct |
3 |
Correct |
18 ms |
14848 KB |
Output is correct |
4 |
Correct |
16 ms |
14720 KB |
Output is correct |
5 |
Correct |
16 ms |
14848 KB |
Output is correct |
6 |
Correct |
18 ms |
14848 KB |
Output is correct |
7 |
Correct |
15 ms |
14840 KB |
Output is correct |
8 |
Correct |
16 ms |
14720 KB |
Output is correct |
9 |
Correct |
16 ms |
14848 KB |
Output is correct |
10 |
Correct |
24 ms |
16248 KB |
Output is correct |
11 |
Correct |
26 ms |
16252 KB |
Output is correct |
12 |
Correct |
25 ms |
16128 KB |
Output is correct |
13 |
Correct |
24 ms |
16232 KB |
Output is correct |
14 |
Correct |
26 ms |
16376 KB |
Output is correct |
15 |
Correct |
27 ms |
16372 KB |
Output is correct |
16 |
Correct |
1210 ms |
102880 KB |
Output is correct |
17 |
Correct |
1262 ms |
105344 KB |
Output is correct |
18 |
Correct |
1107 ms |
103628 KB |
Output is correct |
19 |
Correct |
1174 ms |
103088 KB |
Output is correct |
20 |
Correct |
1165 ms |
102836 KB |
Output is correct |
21 |
Correct |
1258 ms |
102924 KB |
Output is correct |
22 |
Correct |
1360 ms |
102872 KB |
Output is correct |
23 |
Correct |
1115 ms |
105284 KB |
Output is correct |
24 |
Correct |
828 ms |
103724 KB |
Output is correct |
25 |
Correct |
922 ms |
103028 KB |
Output is correct |
26 |
Correct |
1050 ms |
102960 KB |
Output is correct |
27 |
Correct |
1066 ms |
102948 KB |
Output is correct |
28 |
Correct |
1946 ms |
110312 KB |
Output is correct |
29 |
Correct |
1744 ms |
110276 KB |
Output is correct |
30 |
Correct |
1747 ms |
110356 KB |
Output is correct |
31 |
Correct |
1765 ms |
110300 KB |
Output is correct |
32 |
Correct |
1158 ms |
102852 KB |
Output is correct |
33 |
Correct |
1152 ms |
103052 KB |
Output is correct |
34 |
Correct |
502 ms |
68188 KB |
Output is correct |
35 |
Correct |
1520 ms |
105552 KB |
Output is correct |
36 |
Correct |
1312 ms |
103492 KB |
Output is correct |
37 |
Correct |
1586 ms |
104572 KB |
Output is correct |
38 |
Correct |
1510 ms |
104080 KB |
Output is correct |
39 |
Correct |
1794 ms |
110912 KB |
Output is correct |
40 |
Correct |
1653 ms |
114752 KB |
Output is correct |
41 |
Correct |
929 ms |
104148 KB |
Output is correct |
42 |
Correct |
1088 ms |
103380 KB |
Output is correct |
43 |
Correct |
1687 ms |
110912 KB |
Output is correct |
44 |
Correct |
1193 ms |
104688 KB |
Output is correct |
45 |
Correct |
809 ms |
111172 KB |
Output is correct |
46 |
Correct |
1193 ms |
110948 KB |
Output is correct |
47 |
Correct |
1617 ms |
110628 KB |
Output is correct |
48 |
Correct |
1210 ms |
110284 KB |
Output is correct |
49 |
Correct |
1254 ms |
110528 KB |
Output is correct |
50 |
Correct |
1154 ms |
110424 KB |
Output is correct |
51 |
Correct |
1052 ms |
114676 KB |
Output is correct |
52 |
Correct |
1392 ms |
114648 KB |
Output is correct |