#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <long double, pii> muchie;
const ll NMAX = 100001;
const ll VMAX = 1001;
const ll INF = (1LL << 60);
const ll MOD = 1000000007;
const ll BLOCK = 447;
const ll base = 31;
const ll nr_of_bits = 21;
class AIB{
public:
int aib[NMAX + 1];
void update(int x, int val){
for(; x < NMAX; x += x&(-x))
aib[x] += val;
}
int query(int x){
int val = 0;
for(; x > 0; x -= x&(-x))
val += aib[x];
return val;
}
int first(){
int r = 0, pas = (1 << nr_of_bits), sum = 0;
while(pas){
if(r + pas < NMAX && sum + aib[r + pas] == r + pas){
r += pas;
sum += aib[r];
}
pas /= 2;
}
if(sum == r)
r++;
return r;
}
}aib, primul;
vector <int> v[NMAX];
pii timp[NMAX];
int stamp = 0;
int dp[NMAX][nr_of_bits + 1];
int minim[NMAX];
int lvl[NMAX];
void DFS(int node, int p){
minim[node] = node;
lvl[node] = lvl[p] + 1;
dp[node][0] = p;
timp[node].first = ++stamp;
for(auto x : v[node]){
if(x == p)
continue;
DFS(x, node);
minim[node] = min(minim[node], minim[x]);
}
timp[node].second = stamp;
}
int order[NMAX];
int cnt = 0;
bool cmp(int a, int b){
return minim[a] < minim[b];
}
int f[NMAX];
void baga(int node, int p){
vector <int> cv;
for(auto x : v[node]){
if(x == p) continue;
cv.push_back(x);
}
sort(cv.begin(), cv.end(), cmp);
for(auto x : cv){
baga(x, node);
}
order[++cnt] = node;
f[node] = cnt;
}
int taken[NMAX];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, q, i, root;
cin >> n >> q;
for(i = 1; i <= n; i++){
int x;
cin >> x;
if(x == 0){
root = i;
}else{
v[x].push_back(i);
v[i].push_back(x);
}
}
DFS(root, 0);
for(int j = 1; j <= nr_of_bits; j++){
for(i = 1; i <= n; i++){
dp[i][j] = dp[dp[i][j - 1]][j - 1];
}
}
baga(root, 0);
while(q--){
int t, x;
cin >> t >> x;
if(t == 1){
int ultim = 0;
while(x--){
int unde = primul.first();
int cine = order[unde];
ultim = cine;
primul.update(unde, 1);
taken[cine] = 1;
aib.update(timp[cine].first, 1);
aib.update(timp[cine].second + 1, -1);
}
cout << ultim << "\n";
}else{
int r = x, pas = nr_of_bits, cate = aib.query(timp[x].first);
while(pas >= 0){
int nxt = dp[r][pas];
int diferenta = lvl[x] - lvl[nxt];
if(nxt != 0 && aib.query(timp[nxt].first) + diferenta == cate && taken[nxt])
r = nxt;
pas--;
}
primul.update(f[r], -1);
taken[r] = 0;
aib.update(timp[r].first, -1);
aib.update(timp[r].second + 1, 1);
cout << lvl[x] - lvl[r] << "\n";
}
}
return 0;
}
Compilation message
ballmachine.cpp: In function 'int main()':
ballmachine.cpp:113:9: warning: 'root' may be used uninitialized in this function [-Wmaybe-uninitialized]
113 | baga(root, 0);
| ~~~~^~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
2772 KB |
Output is correct |
2 |
Correct |
94 ms |
12820 KB |
Output is correct |
3 |
Correct |
60 ms |
12364 KB |
Output is correct |
4 |
Correct |
2 ms |
2772 KB |
Output is correct |
5 |
Correct |
2 ms |
2772 KB |
Output is correct |
6 |
Correct |
2 ms |
2900 KB |
Output is correct |
7 |
Correct |
2 ms |
2900 KB |
Output is correct |
8 |
Correct |
3 ms |
2832 KB |
Output is correct |
9 |
Correct |
7 ms |
3284 KB |
Output is correct |
10 |
Correct |
20 ms |
5272 KB |
Output is correct |
11 |
Correct |
101 ms |
12792 KB |
Output is correct |
12 |
Correct |
61 ms |
12364 KB |
Output is correct |
13 |
Correct |
94 ms |
12372 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
35 ms |
8376 KB |
Output is correct |
2 |
Correct |
205 ms |
25688 KB |
Output is correct |
3 |
Correct |
81 ms |
17204 KB |
Output is correct |
4 |
Correct |
91 ms |
9684 KB |
Output is correct |
5 |
Correct |
85 ms |
9680 KB |
Output is correct |
6 |
Correct |
76 ms |
9488 KB |
Output is correct |
7 |
Correct |
73 ms |
8076 KB |
Output is correct |
8 |
Correct |
44 ms |
8420 KB |
Output is correct |
9 |
Correct |
166 ms |
25668 KB |
Output is correct |
10 |
Correct |
185 ms |
25676 KB |
Output is correct |
11 |
Correct |
164 ms |
25404 KB |
Output is correct |
12 |
Correct |
181 ms |
21248 KB |
Output is correct |
13 |
Correct |
129 ms |
29384 KB |
Output is correct |
14 |
Correct |
81 ms |
17304 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
72 ms |
14388 KB |
Output is correct |
2 |
Correct |
207 ms |
22260 KB |
Output is correct |
3 |
Correct |
172 ms |
27572 KB |
Output is correct |
4 |
Correct |
109 ms |
21256 KB |
Output is correct |
5 |
Correct |
128 ms |
21216 KB |
Output is correct |
6 |
Correct |
143 ms |
21264 KB |
Output is correct |
7 |
Correct |
116 ms |
18116 KB |
Output is correct |
8 |
Correct |
122 ms |
27572 KB |
Output is correct |
9 |
Correct |
207 ms |
26132 KB |
Output is correct |
10 |
Correct |
195 ms |
26076 KB |
Output is correct |
11 |
Correct |
181 ms |
26048 KB |
Output is correct |
12 |
Correct |
230 ms |
22228 KB |
Output is correct |
13 |
Correct |
201 ms |
34080 KB |
Output is correct |
14 |
Correct |
111 ms |
18372 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
219 ms |
25860 KB |
Output is correct |
2 |
Correct |
209 ms |
22028 KB |
Output is correct |
3 |
Correct |
115 ms |
32796 KB |
Output is correct |
4 |
Correct |
215 ms |
25952 KB |
Output is correct |
5 |
Correct |
228 ms |
25760 KB |
Output is correct |
6 |
Correct |
162 ms |
25288 KB |
Output is correct |
7 |
Correct |
199 ms |
22012 KB |
Output is correct |
8 |
Correct |
129 ms |
32844 KB |
Output is correct |
9 |
Correct |
78 ms |
17280 KB |
Output is correct |