#include <cstdio>
#include <vector>
#include <algorithm>
#include <utility>
#include <set>
using namespace std;
struct BallMachine {
vector<vector<int>> tree, hldPaths;
vector<int> par, pathIn, placeInPath, highestFilled, st, childCount, depth;
vector<bool> filled;
set<pair<int, int>> leafSet;
int travT = 0, root;
int findInfo(int v, int p, int level) {
st[v] = travT++;
par[v] = p;
depth[v] = level;
int stSize = 1;
int bestChild = -1, bchilds = -1;
for (int child : tree[v]) {
// printf("%d att %d\n", v, child);
if (child != p) {
int childSize = findInfo(child, v, level + 1);
if (childSize > bchilds) {
bestChild = child, bchilds = childSize;
}
stSize += childSize;
++childCount[v];
}
}
int pathToAdd = -1;
// printf("%d in path %d\n", v, pathToAdd);
if (stSize == 1) {
pathToAdd = hldPaths.size();
hldPaths.emplace_back(1, -1);
leafSet.emplace(st[v], v);
highestFilled.push_back(0);
// printf("%d leaf\n", v);
} else {
pathToAdd = pathIn[bestChild];
}
placeInPath[v] = hldPaths[pathToAdd].size();
hldPaths[pathToAdd].push_back(v);
pathIn[v] = pathToAdd;
// printf("searching %d\n", v + 1);
// printf("%d in path %d\n", v + 1, pathToAdd);
return stSize;
}
BallMachine(vector<vector<int>> tree, int rt) : tree(tree),
par(tree.size()), pathIn(tree.size()), placeInPath(tree.size()), st(tree.size()),
childCount(tree.size()), depth(tree.size()), filled(tree.size()), root(rt)
{findInfo(root, -1, 0);}
int addBall() { // returns place where ball was placed
int vToRemove = leafSet.begin()->second;
// printf("making %d filled\n", vToRemove);
leafSet.erase(make_pair(st[vToRemove], vToRemove));
++highestFilled[pathIn[vToRemove]];
if (par[vToRemove] != -1) {
--childCount[par[vToRemove]];
if (childCount[par[vToRemove]] == 0) {
leafSet.emplace(st[par[vToRemove]], par[vToRemove]);
}
}
filled[vToRemove] = true;
return vToRemove;
}
int deleteBall(int x) { // returns number of shifted balls
int vToBlank = -1;
// printf("deleting %d\n", x + 1);
for (int cPath = pathIn[x];;) {
// printf("in path %d root %d\n", cPath, root);
// printf("highfill in path is %d\n", hldPaths[cPath][highestFilled[cPath]]);
if ((hldPaths[cPath][highestFilled[cPath]] == root)
|| (highestFilled[cPath] != hldPaths[cPath].size() - 1)
|| (par[hldPaths[cPath].back()] != -1 and !filled[par[hldPaths[cPath].back()]])) {
// we can stop at this vertex
// printf("case goes here\n");
vToBlank = hldPaths[cPath][highestFilled[cPath]]; break;
} else {
// we need to climb further
cPath = pathIn[par[hldPaths[cPath].back()]];
}
}
// printf("found vtb: %d\n", vToBlank + 1);
filled[vToBlank] = false;
if (par[vToBlank] != -1) {
++childCount[par[vToBlank]];
if (childCount[par[vToBlank]] == 1) {
leafSet.erase(make_pair(st[par[vToBlank]], par[vToBlank]));
}
}
leafSet.insert(make_pair(st[vToBlank], vToBlank));
--highestFilled[pathIn[vToBlank]];
return depth[x] - depth[vToBlank];
}
};
int main() {
int n, q, root = 0; scanf("%d %d", &n, &q);
vector<vector<int>> tree(n);
for (int i = 0; i < n; ++i) {
int par; scanf("%d", &par);
--par;
if (par >= 0) {
tree[par].push_back(i);
tree[i].push_back(par);
} else {
root = i;
}
}
BallMachine bm(tree, root);
for (int qta = 0; qta < q; ++qta) {
int type, param; scanf("%d %d", &type, ¶m);
if (type == 1) {
int ans = -1;
for (int rep = 1; rep <= param; ++rep) ans = bm.addBall();
printf("%d\n", ans + 1);
} else {
printf("-1\n"); continue;
printf("%d\n", bm.deleteBall(--param));
}
}
return 0;
}
Compilation message
ballmachine.cpp: In member function 'int BallMachine::deleteBall(int)':
ballmachine.cpp:75:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
|| (highestFilled[cPath] != hldPaths[cPath].size() - 1)
ballmachine.cpp: In function 'int main()':
ballmachine.cpp:100:27: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
int n, q, root = 0; scanf("%d %d", &n, &q);
~~~~~^~~~~~~~~~~~~~~~~
ballmachine.cpp:103:17: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
int par; scanf("%d", &par);
~~~~~^~~~~~~~~~~~
ballmachine.cpp:114:25: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
int type, param; scanf("%d %d", &type, ¶m);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
2 ms |
376 KB |
Output isn't correct |
2 |
Incorrect |
158 ms |
16288 KB |
Output isn't correct |
3 |
Incorrect |
147 ms |
16896 KB |
Output isn't correct |
4 |
Incorrect |
2 ms |
16896 KB |
Output isn't correct |
5 |
Incorrect |
3 ms |
16896 KB |
Output isn't correct |
6 |
Incorrect |
4 ms |
16896 KB |
Output isn't correct |
7 |
Incorrect |
4 ms |
16896 KB |
Output isn't correct |
8 |
Incorrect |
4 ms |
16896 KB |
Output isn't correct |
9 |
Incorrect |
12 ms |
16896 KB |
Output isn't correct |
10 |
Incorrect |
23 ms |
16896 KB |
Output isn't correct |
11 |
Incorrect |
118 ms |
17360 KB |
Output isn't correct |
12 |
Incorrect |
143 ms |
17900 KB |
Output isn't correct |
13 |
Incorrect |
141 ms |
18316 KB |
Output isn't correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
68 ms |
18316 KB |
Output isn't correct |
2 |
Incorrect |
211 ms |
29124 KB |
Output isn't correct |
3 |
Incorrect |
181 ms |
30036 KB |
Output isn't correct |
4 |
Incorrect |
66 ms |
30036 KB |
Output isn't correct |
5 |
Incorrect |
70 ms |
30036 KB |
Output isn't correct |
6 |
Incorrect |
78 ms |
30036 KB |
Output isn't correct |
7 |
Incorrect |
64 ms |
30036 KB |
Output isn't correct |
8 |
Incorrect |
51 ms |
30036 KB |
Output isn't correct |
9 |
Incorrect |
176 ms |
31332 KB |
Output isn't correct |
10 |
Incorrect |
192 ms |
33440 KB |
Output isn't correct |
11 |
Incorrect |
192 ms |
34292 KB |
Output isn't correct |
12 |
Incorrect |
171 ms |
34292 KB |
Output isn't correct |
13 |
Incorrect |
128 ms |
34292 KB |
Output isn't correct |
14 |
Incorrect |
177 ms |
35876 KB |
Output isn't correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
91 ms |
35876 KB |
Output isn't correct |
2 |
Incorrect |
215 ms |
35876 KB |
Output isn't correct |
3 |
Incorrect |
106 ms |
35876 KB |
Output isn't correct |
4 |
Incorrect |
126 ms |
35876 KB |
Output isn't correct |
5 |
Incorrect |
136 ms |
35876 KB |
Output isn't correct |
6 |
Incorrect |
145 ms |
35876 KB |
Output isn't correct |
7 |
Incorrect |
139 ms |
35876 KB |
Output isn't correct |
8 |
Incorrect |
135 ms |
35876 KB |
Output isn't correct |
9 |
Incorrect |
205 ms |
36932 KB |
Output isn't correct |
10 |
Incorrect |
204 ms |
38508 KB |
Output isn't correct |
11 |
Incorrect |
201 ms |
38560 KB |
Output isn't correct |
12 |
Incorrect |
206 ms |
38560 KB |
Output isn't correct |
13 |
Incorrect |
170 ms |
38560 KB |
Output isn't correct |
14 |
Incorrect |
195 ms |
39004 KB |
Output isn't correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
213 ms |
39004 KB |
Output isn't correct |
2 |
Incorrect |
188 ms |
39004 KB |
Output isn't correct |
3 |
Incorrect |
164 ms |
40024 KB |
Output isn't correct |
4 |
Incorrect |
191 ms |
40024 KB |
Output isn't correct |
5 |
Incorrect |
183 ms |
42032 KB |
Output isn't correct |
6 |
Incorrect |
194 ms |
42692 KB |
Output isn't correct |
7 |
Incorrect |
200 ms |
42692 KB |
Output isn't correct |
8 |
Incorrect |
188 ms |
43112 KB |
Output isn't correct |
9 |
Incorrect |
173 ms |
44348 KB |
Output isn't correct |