Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

http://acm.hdu.edu.cn/showproblem.php?pid=1540

View Code
 1 //HDU 1540
2 #include <cstdio>
3 using namespace std;
4 const int N=50010;
5 struct segtree
6 {
7 int l,r,ls,rs;
8 int m() {return (l+r)/2;}
9 int len() {return r-l+1;}
10 }st[N*4];
11 int des[N];
12 void pushup(int rt)
13 {
14 int lrt=rt*2,rrt=rt*2+1;
15 st[rt].ls=st[lrt].ls;
16 if (st[lrt].ls==st[lrt].len()) st[rt].ls+=st[rrt].ls;
17 st[rt].rs=st[rrt].rs;
18 if (st[rrt].rs==st[rrt].len()) st[rt].rs+=st[lrt].rs;
19 }
20 void build(int l,int r,int rt)
21 {
22 st[rt].l=l; st[rt].r=r;
23 if (l==r)
24 {
25 st[rt].ls=st[rt].rs=1;
26 return;
27 }
28 int m=st[rt].m();
29 build(l,m,rt*2);
30 build(m+1,r,rt*2+1);
31 pushup(rt);
32 }
33 void update(int p,int x,int rt)
34 {
35 int l=st[rt].l,r=st[rt].r;
36 if (l==r)
37 {
38 st[rt].ls=st[rt].rs=x;
39 return;
40 }
41 int m=st[rt].m();
42 if (p<=m) update(p,x,rt*2);
43 if (p>m) update(p,x,rt*2+1);
44 pushup(rt);
45 }
46 int query(int p,int rt)
47 {
48 int l=st[rt].l,r=st[rt].r;
49 if (l==r) return 0;
50 int m=st[rt].m();
51 int lrt=rt*2,rrt=rt*2+1;
52 if (p<=m)
53 {
54 if (st[lrt].rs>=m-p+1) return st[lrt].rs+st[rrt].ls;
55 else return query(p,lrt);
56 }
57 else
58 {
59 if (st[rrt].ls>=p-m) return st[lrt].rs+st[rrt].ls;
60 else return query(p,rrt);
61 }
62 }
63 int main()
64 {
65 int n,m;
66 while (~scanf("%d%d",&n,&m))
67 {
68 build(1,n,1);
69 char op[2];
70 int x,top=0;
71 while (m--)
72 {
73 scanf("%s",op);
74 switch (op[0])
75 {
76 case 'D':
77 scanf("%d",&x);
78 des[top++]=x;
79 update(x,0,1);
80 break;
81 case 'R':
82 x=des[--top];
83 update(x,1,1);
84 break;
85 case 'Q':
86 scanf("%d",&x);
87 printf("%d\n",query(x,1));
88 break;
89 }
90 }
91 }
92 return 0;
93 }

 

posted on 2012-03-01 14:31  Qiuqiqiu  阅读(165)  评论(0编辑  收藏  举报