제출 #110690

#제출 시각아이디문제언어결과실행 시간메모리
110690ckodserBall Machine (BOI13_ballmachine)C++14
0.56 / 100
1077 ms130172 KiB
#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
int n, q, ts, P[N], H[N], rev[N], st[N], fn[N], mn[N];
vector < int > Adj[N];
set < int > S;
struct CMPH {
	inline bool operator () (int v, int u) {
		return (H[v] > H[u]);
	}
};
set < int , CMPH > T[N * 2];
bool CMP(int i, int j)
{
	return (mn[i] < mn[j]);
}
bool CMP2(int i, int j)
{
	return (st[i] < st[j]);
}
void DFS(int v)
{
	mn[v] = v;
	st[v] = ts ++;
	for (int &u : Adj[v])
	{
		H[u] = H[v] + 1;
		DFS(u);
		mn[v] = min(mn[v], mn[u]);
	}
	fn[v] = ts;
}
void DFS2(int v)
{
	for (int &u : Adj[v])
		DFS2(u);
	P[v] = ts ++;
	rev[P[v]] = v;
	S.insert(P[v]);
}
inline void Add(int le, int ri, int v)
{
	le += n + 1;
	ri += n + 1;
	for (; le < ri; le >>= 1, ri >>= 1)
	{
		if (le & 1) T[le].insert(v), le ++;
		if (ri & 1) ri --, T[ri].insert(v);
	}
}
inline void Del(int le, int ri, int v)
{
	le += n + 1;
	ri += n + 1;
	for (; le < ri; le >>= 1, ri >>= 1)
	{
		if (le & 1) T[le].erase(v), le ++;
		if (ri & 1) ri --, T[ri].erase(v);
	}
}
inline int Get(int i)
{
	int v = 0;
	i += n + 1;
	for (; i; i >>= 1)
		if (H[v] < H[*T[i].begin()])
			v = *T[i].begin();
	return (v);
}
int main()
{
	scanf("%d%d", &n, &q);
	for (int i = 1, p; i <= n; i++)
		scanf("%d", &p), Adj[p].push_back(i);
	DFS(0);
	for (int i = 0; i <= n; i++)
		sort(Adj[i].begin(), Adj[i].end(), CMP);
	ts = 0; DFS2(0);
	for (int i = 0; i <= n; i++)
		Add(st[i], fn[i], i);
	for (int i = 0; i <= n; i++)
		sort(Adj[i].begin(), Adj[i].end(), CMP2);
	for (; q; q --)
	{
		int tp, v;
		scanf("%d%d", &tp, &v);
		if (tp == 1)
		{
			int u;
			for (; v; v --)
			{
				u = rev[*S.begin()];
				S.erase(S.begin());
				Del(st[u], fn[u], u);
			}
			printf("%d\n", u);
		}
		else
		{
			int u = Get(st[v]);
			int lb = upper_bound(Adj[u].begin(), Adj[u].end(), st[v], CMP2) - Adj[u].begin() - 1;
			u = Adj[u][lb];
			S.insert(P[u]);
			Add(st[u], fn[u], u);
			printf("%d\n", H[v] - H[u]);
		}
	}
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

ballmachine.cpp: In function 'int main()':
ballmachine.cpp:72:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &n, &q);
  ~~~~~^~~~~~~~~~~~~~~~
ballmachine.cpp:74:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &p), Adj[p].push_back(i);
   ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
ballmachine.cpp:86:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", &tp, &v);
   ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...