P1503 鬼子进村 - 平衡树

平衡树维护被毁坏的房子就好了
set可以水过。。。注意边界问题

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <set>
#include <stack>
using namespace std;
#define debug(x) cerr << #x << "=" << x << endl;
const int MAXN = 50000 + 10;
typedef long long ll;
int n,m,a[MAXN],last,vis[MAXN];
set<int> s;
set<int> :: iterator it;
stack<int> sta;
int main() {
	scanf("%d%d", &n, &m);
	char cmd[5];
	for(int i=1; i<=m; i++) {
		int x;
		scanf("%s", cmd);
		if(cmd[0] == 'D') {
			scanf("%d", &x);
			sta.push(x);
			vis[x] = 1;
			s.insert(x);
		} else if(cmd[0] == 'R') {
			vis[sta.top()] = 0;
			s.erase(sta.top());
			sta.pop();
		} else if(cmd[0] == 'Q') {
			scanf("%d", &x);
			it = s.upper_bound(x);
			if(vis[x]) {
				printf("0\n");
				continue;
			}
			int l = 1, r = n;
			if(it != s.end()) {
				r = *it;
				r--;
			}
			it = s.lower_bound(x);
			if(it != s.begin()) {
				it--;
				l = *it;
				l++;	
			}
			int ans = r - l + 1;
			printf("%d\n", ans);
		}
	}
	return 0;
}
posted @ 2018-10-18 07:28  Zolrk  阅读(90)  评论(0编辑  收藏  举报