| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
用SBT暴做的#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define MAX_N 51000
#define MAX_M 101000
typedef int mint[MAX_M];
class SBT
{
public :
mint key, l, r, s;
int tot, rt, ts;
void lr(int &x)
{
int y = r[x];
r[x] = l[y], l[y] = x;
s[y] = s[x], s[x] = s[l[x]] + s[r[x]] + 1;
x = y;
}
void rr(int &x)
{
int y = l[x];
l[x] = r[y], r[y] = x;
s[y] = s[x], s[x] = s[l[x]] + s[r[x]] + 1;
x = y;
}
void maintain(int &x, bool w)
{
if (!w)
{
if (s[l[l[x]]] > s[r[x]]) rr(x);
else if (s[r[l[x]]] > s[r[x]]) lr(l[x]), rr(x);
else return ;
}
else
{
if (s[r[r[x]]] > s[l[x]]) lr(x);
else if (s[l[r[x]]] > s[l[x]]) rr(r[x]), lr(x);
else return ;
}
maintain (l[x], false);
maintain (r[x], true);
maintain (x, false);
maintain (x, true);
}
void insert(int &x, int w)
{
if (!x)
{
x = ++tot, l[x] = r[x] = 0;
key[x] = w, s[x] = 1;
return ;
}
s[x]++;
if (w < key[x]) insert (l[x], w);
else insert (r[x], w);
maintain (x, w >= key[x]);
}
int del(int &x, int w)
{
s[x]--;
if (w == key[x] || (w < key[x] && !l[x]) || (w > key[x] && !r[x]))
{
int t = key[x];
if (!l[x] || !r[x]) x = l[x] + r[x];
else key[x] = del (l[x], t + 1);
return t;
}
if (w < key[x]) return del (l[x], w);
else return del (r[x], w);
}
void findmin(int x, int w)
{
if (w >= key[x])
{
ts = key[x];
if (key[x] != w && r[x]) findmin (r[x], w);
}
else if (l[x]) findmin (l[x], w);
}
void findmax(int x, int w)
{
if (w <= key[x])
{
ts = key[x];
if (key[x] != w && l[x]) findmax (l[x], w);
}
else if (r[x]) findmax (r[x], w);
}
int findmin(int w) { findmin (rt, w); return ts; }
int findmax(int w) { findmax (rt, w); return ts; }
void insert(int w) { insert (rt, w); }
void del(int w) { del (rt, w); }
};
SBT p;
int st[MAX_N];
char str[10];
int n, m, top;
int main(void)
{
scanf ("%d%d", &n, &m);
p.insert (0), p.insert (n + 1);
for (int i = 1, x, s; i <= m; i++)
{
scanf ("%s", str);
int t1, t2;
switch (str[0])
{
case 'D':
scanf ("%d", &x), p.insert(x), st[++top] = x; break;
case 'Q':
scanf ("%d", &x);
s = p.findmax (x) - p.findmin (x) - 1;
printf ("%d\n", max (s, 0));
break;
case 'R':
p.del (st[top--]);
break;
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator