#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100000
#define N_ (1 << 17) /* N_ = pow2(ceil(log2(N))) */
unsigned int X = 12345;
int rand_() {
return (X *= 3) >> 1;
}
int min(int a, int b) { return a < b ? a : b; }
int *oj[N], oo[N];
void append(int i, int j) {
int o = oo[i]++;
if (o >= 2 && (o & o - 1) == 0)
oj[i] = (int *) realloc(oj[i], o * 2 * sizeof *oj[i]);
oj[i][o] = j;
}
int pp[N], qq[N], dd[N], sz[N], jj[N], dp[N], qu[N], cnt;
void dfs1(int i, int d) {
int o, j_;
qu[cnt++] = i;
j_ = -1;
dd[i] = d, sz[i] = 1, dp[i] = i;
for (o = 0; o < oo[i]; o++) {
int j = oj[i][o];
dfs1(j, d + 1);
if (j_ == -1 || sz[j_] < sz[j])
j_ = j;
sz[i] += sz[j];
dp[i] = min(dp[i], dp[j]);
}
jj[i] = j_;
if (j_ != -1)
qq[j_] = -1;
}
int lca_(int i, int j) {
int i_ = i, a;
while (qq[i] != qq[j])
if (dd[qq[i]] > dd[qq[j]])
i = pp[qq[i]];
else
j = pp[qq[j]];
a = dd[i] < dd[j] ? i : j;
i = qq[i_];
while (dd[i] > dd[a] + 1)
i = qq[pp[i]];
return dd[i] == dd[a] + 1 ? i : jj[a];
}
void sort(int *ii, int l, int r) {
while (l < r) {
int i = l, j = l, k = r, i_ = ii[l + rand_() % (r - l)], tmp;
while (j < k)
if (dp[ii[j]] == dp[i_])
j++;
else if (dp[ii[j]] < dp[i_]) {
tmp = ii[i], ii[i] = ii[j], ii[j] = tmp;
i++, j++;
} else {
k--;
tmp = ii[j], ii[j] = ii[k], ii[k] = tmp;
}
sort(ii, l, i);
l = k;
}
}
int hh[N];
void dfs2(int i) {
int o;
sort(oj[i], 0, oo[i]);
for (o = 0; o < oo[i]; o++) {
int j = oj[i][o];
dfs2(j);
}
hh[qu[cnt] = i] = cnt, cnt++;
}
int st[N_ * 2], h_, n_; char lz[N_];
void put(int i) {
st[i] = 0;
if (i < n_)
lz[i] = 1;
}
void pus(int i) {
if (lz[i]) {
put(i << 1), put(i << 1 | 1);
lz[i] = 0;
}
}
void pul(int i) {
if (!lz[i])
st[i] = st[i << 1] + st[i << 1 | 1];
}
void push(int i) {
int h;
for (h = h_; h > 0; h--)
pus(i >> h);
}
void pull(int i) {
while (i > 1)
pul(i >>= 1);
}
void build(int n) {
int i;
h_ = 0;
while (1 << h_ < n)
h_++;
n_ = 1 << h_;
for (i = 0; i < n; i++)
st[n_ + i] = 1;
for (i = n_ - 1; i > 0; i--)
pul(i);
}
int find(int k) {
int i = 1;
while (i < n_) {
pus(i);
i <<= 1;
if (k > st[i])
k -= st[i], i ^= 1;
}
return i - n_;
}
void update(int r) {
int l = 0, l_ = l += n_, r_ = r += n_;
push(l_), push(r_);
for ( ; l <= r; l >>= 1, r >>= 1) {
if ((l & 1) == 1)
put(l++);
if ((r & 1) == 0)
put(r--);
}
pull(l_), pull(r_);
}
void upd(int i) {
push(i += n_);
st[i] = 1;
pull(i);
}
int higher(int l) {
int r = n_ - 1, l_ = l += n_, r_ = r += n_;
push(l_), push(r_);
for ( ; l <= r; l >>= 1, r >>= 1)
if ((l & 1) == 1) {
if (st[l] > 0) {
while (l < n_) {
pus(l);
l = st[l << 1] > 0 ? l << 1 : l << 1 | 1;
}
return l - n_;
}
l++;
}
return -1;
}
int main() {
int n, q, h, i, r;
scanf("%d%d", &n, &q);
r = -1;
for (i = 0; i < n; i++)
oj[i] = (int *) malloc(2 * sizeof *oj[i]);
for (i = 0; i < n; i++) {
scanf("%d", &pp[i]), pp[i]--;
if (pp[i] == -1)
r = i;
else
append(pp[i], i);
}
dfs1(r, 0);
for (h = 0; h < cnt; h++) {
i = qu[h];
qq[i] = qq[i] ? qq[pp[i]] : i;
}
cnt = 0;
dfs2(r);
build(n);
while (q--) {
int t;
scanf("%d", &t);
if (t == 1) {
int k;
scanf("%d", &k);
h = find(k);
update(h);
printf("%d\n", qu[h] + 1);
} else {
int p;
scanf("%d", &i), i--;
h = higher(hh[i]);
p = h == -1 ? r : lca_(i, qu[h]);
upd(hh[p]);
printf("%d\n", dd[i] - dd[p]);
}
}
return 0;
}
Compilation message
ballmachine.c: In function 'append':
ballmachine.c:21:23: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
21 | if (o >= 2 && (o & o - 1) == 0)
| ~~^~~
ballmachine.c: In function 'main':
ballmachine.c:193:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
193 | scanf("%d%d", &n, &q);
| ^~~~~~~~~~~~~~~~~~~~~
ballmachine.c:198:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
198 | scanf("%d", &pp[i]), pp[i]--;
| ^~~~~~~~~~~~~~~~~~~
ballmachine.c:215:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
215 | scanf("%d", &t);
| ^~~~~~~~~~~~~~~
ballmachine.c:219:4: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
219 | scanf("%d", &k);
| ^~~~~~~~~~~~~~~
ballmachine.c:226:4: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
226 | scanf("%d", &i), i--;
| ^~~~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
340 KB |
Output is correct |
2 |
Correct |
73 ms |
6988 KB |
Output is correct |
3 |
Correct |
60 ms |
6940 KB |
Output is correct |
4 |
Correct |
1 ms |
292 KB |
Output is correct |
5 |
Correct |
1 ms |
340 KB |
Output is correct |
6 |
Correct |
1 ms |
340 KB |
Output is correct |
7 |
Correct |
1 ms |
432 KB |
Output is correct |
8 |
Correct |
1 ms |
436 KB |
Output is correct |
9 |
Correct |
5 ms |
700 KB |
Output is correct |
10 |
Correct |
13 ms |
1972 KB |
Output is correct |
11 |
Correct |
63 ms |
7104 KB |
Output is correct |
12 |
Correct |
64 ms |
7068 KB |
Output is correct |
13 |
Correct |
67 ms |
7060 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
42 ms |
4072 KB |
Output is correct |
2 |
Correct |
91 ms |
14180 KB |
Output is correct |
3 |
Correct |
78 ms |
10068 KB |
Output is correct |
4 |
Correct |
42 ms |
4876 KB |
Output is correct |
5 |
Correct |
45 ms |
4884 KB |
Output is correct |
6 |
Correct |
42 ms |
4808 KB |
Output is correct |
7 |
Correct |
41 ms |
3992 KB |
Output is correct |
8 |
Correct |
39 ms |
4044 KB |
Output is correct |
9 |
Correct |
83 ms |
14176 KB |
Output is correct |
10 |
Correct |
86 ms |
14048 KB |
Output is correct |
11 |
Correct |
84 ms |
14064 KB |
Output is correct |
12 |
Correct |
80 ms |
11968 KB |
Output is correct |
13 |
Correct |
82 ms |
16084 KB |
Output is correct |
14 |
Correct |
75 ms |
10056 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
43 ms |
7376 KB |
Output is correct |
2 |
Correct |
91 ms |
12364 KB |
Output is correct |
3 |
Correct |
72 ms |
14608 KB |
Output is correct |
4 |
Correct |
59 ms |
11476 KB |
Output is correct |
5 |
Correct |
61 ms |
11392 KB |
Output is correct |
6 |
Correct |
59 ms |
11340 KB |
Output is correct |
7 |
Correct |
58 ms |
9768 KB |
Output is correct |
8 |
Correct |
63 ms |
14656 KB |
Output is correct |
9 |
Correct |
91 ms |
14332 KB |
Output is correct |
10 |
Correct |
91 ms |
14248 KB |
Output is correct |
11 |
Correct |
103 ms |
14244 KB |
Output is correct |
12 |
Correct |
95 ms |
12364 KB |
Output is correct |
13 |
Correct |
96 ms |
18388 KB |
Output is correct |
14 |
Correct |
83 ms |
10660 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
97 ms |
14476 KB |
Output is correct |
2 |
Correct |
96 ms |
12344 KB |
Output is correct |
3 |
Correct |
93 ms |
17984 KB |
Output is correct |
4 |
Correct |
91 ms |
14432 KB |
Output is correct |
5 |
Correct |
119 ms |
14292 KB |
Output is correct |
6 |
Correct |
93 ms |
14204 KB |
Output is correct |
7 |
Correct |
94 ms |
12444 KB |
Output is correct |
8 |
Correct |
84 ms |
17996 KB |
Output is correct |
9 |
Correct |
76 ms |
10016 KB |
Output is correct |