HDU 1540(Tunnel Warfare)

#include <iostream>
#include <stack>
using namespace std;
const int MAXN = 50005;

int L[4 * MAXN], R[4 * MAXN];
int flag;

void build(int l, int r, int rt)
{
	L[rt] = R[rt] = r - l + 1;
	if (l == r)
		return;
	int m = (l + r) >> 1;
	build(l, m, rt << 1);
	build(m + 1, r, rt << 1 | 1);
}

void pushup(int rt, int m)
{
	L[rt] = L[rt << 1];
	R[rt] = R[rt << 1 | 1];
	if (L[rt] == m - (m >> 1)) 
		L[rt] += L[rt << 1 | 1];
	if (R[rt] == m >> 1)
		R[rt] += R[rt << 1];
}

void update(int p, int num, int l, int r, int rt)
{
	if (l == r) 
	{
		L[rt] = R[rt] = num;
		return;
	}
	int m = (l + r) >> 1;
	if (p <= m)
		update(p, num, l, m, rt << 1);
	else
		update(p, num, m + 1, r, rt << 1 | 1);
	pushup(rt, r - l + 1);
}

int query(int p, int l, int r, int rt)
{
	if (R[rt] >= r - p + 1)
	{
		flag = 1;
		return R[rt];
	}
	if (L[rt] >= p - l + 1) 
	{
		flag = 1;
		return L[rt];
	}
	if (l == r)
		return 0;
	int m = (l + r) >> 1;
	int total = 0;
	if (p > m)
	{
		total = query(p, m + 1, r, rt << 1 | 1);
		if (flag)
		{
			flag = 0;
			total += R[rt << 1];
		}
	}
	else 
	{
		total = query(p, l, m, rt << 1);
		if (flag) 
		{
			flag = 0;
			total += L[rt << 1 | 1];
		}
	}
	return total;
}

int main()
{
	int n, m;
	while (cin >> n >> m)
	{
		build(1, n, 1);

		char c;
		int num;
		stack<int> st;
		for (int i = 0; i < m; i++)
		{
			cin >> c;
			if (c == 'D')
			{
				cin >> num;
				st.push(num);
				update(num, 0, 1, n, 1);
			}
			else if (c == 'Q')
			{
				flag = 0;
				cin >> num;
				cout << query(num, 1, n, 1) << endl;
			}
			else
			{
				num = st.top();
				st.pop();
				update(num, 1, 1, n, 1);
			}
		}
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章