Submission #152558

#TimeUsernameProblemLanguageResultExecution timeMemory
152558VlatkoBall Machine (BOI13_ballmachine)C++14
100 / 100
606 ms25124 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int maxn = 100010;
const int maxk = 17;

int n, q, root;

vector<int> children[maxn];
int depth[maxn];
int sbmin[maxn];
int P[maxn][maxk];

int numdone;
int order[maxn];
bool is_available[maxn];

struct Comp {
	bool operator () (const int a, const int b) const {
		return order[a] < order[b];
	}
};
set<int, Comp> available;

void dfs1(int u) {
	sbmin[u] = u;
	for (int v : children[u]) {
		depth[v] = depth[u] + 1;
		dfs1(v);
		sbmin[u] = min(sbmin[u], sbmin[v]);
	}
}

void dfs2(int u) {
	sort(children[u].begin(), children[u].end(), [&] (int x, int y) {
		return sbmin[x] < sbmin[y];
	});
	for (int v : children[u]) {
		dfs2(v);
	}
	order[u] = ++numdone;
	available.insert(u);
	is_available[u] = true;
}

int add_ball() {
	auto it = available.begin();
	int u = *it;
	available.erase(it);
	//cout << "adding ball, u=" << u << "\n";
	is_available[u] = false;
	return u;
}

int remove_ball(int u) {
	//cout << "removing ball, u=" << u << " ... ";
	int ud = depth[u];
	for (int j = maxk-1; j >= 0; --j) {
		if (P[u][j] != -1 && !is_available[P[u][j]]) {
			u = P[u][j];
		} 
	}
	//cout << "u=" << u << endl;
	available.insert(u);
	is_available[u] = true;
	return ud - depth[u];
}

int main() {
    ios::sync_with_stdio(false); cin.tie(0);
    //freopen("in.txt", "r", stdin);
    cin >> n >> q;
    for (int i = 1; i <= n; ++i) {
		cin >> P[i][0];
        if (P[i][0] == 0) {
            root = i;
            P[i][0] = -1;
        } else {
            children[P[i][0]].push_back(i);
        }
    }
    depth[root] = 0;
    sbmin[root] = root;
    dfs1(root);
	numdone = 0;
    dfs2(root);
    for (int j = 1; j < maxk; ++j) {
		for (int i = 1; i <= n; ++i) {
			if (P[i][j-1] != -1) {
				P[i][j] = P[P[i][j-1]][j-1];
			} else {
				P[i][j] = -1;
			}
		}
	}
    while (q--) {
        int t, k;
        cin >> t >> k;
        if (t == 1) {
            int res;
            while (k--) {
                res = add_ball();
            }
            cout << res << endl;
        } else {
			int res = remove_ball(k);
			cout << res << endl;
        }
    }
}

Compilation message (stderr)

ballmachine.cpp: In function 'int main()':
ballmachine.cpp:107:21: warning: 'res' may be used uninitialized in this function [-Wmaybe-uninitialized]
             cout << res << endl;
                     ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...