1 /**************************************************************
8 ****************************************************************/
10 //Algorithm: Fenwick Tree & Persistent Segment Tree
14 const int maxnode
= 5e6
+ 10,maxn
= 1e4
+ 10,rlim
= 1<<30;
19 } pool
[maxnode
],*tot
= &pool
[0],*root
[maxn
];
23 node
* Insert(node
* orig
, int l
, int r
, int pos
, int val
) {
24 if (orig
== NULL
) orig
= tot
++;
26 if (l
== r
) return orig
;
28 if (pos
<= m
) orig
->ch
[0] = Insert(orig
->ch
[0],l
,m
,pos
,val
); else orig
->ch
[1] = Insert(orig
->ch
[1],m
+1,r
,pos
,val
);
32 inline int lowbit(int x
) { return x
& -x
; }
34 inline void get(std::vector
<node
*> &tree
, int idx
) {
37 tree
.push_back(root
[idx
]);
42 inline int getsum(std::vector
<node
*> &tree
) {
44 std::vector
<node
*>::iterator iter
;
45 for (iter
= tree
.begin(); iter
!= tree
.end(); ++iter
)
46 if ((*iter
) && (*iter
) -> ch
[0]) res
+= (*iter
) -> ch
[0] -> size
;
50 inline void turn(std::vector
<node
*> &tree
, bool d
) {
51 std::vector
<node
*>::iterator iter
;
52 for (iter
= tree
.begin(); iter
!= tree
.end(); ++iter
)
53 if (*iter
) *iter
= (*iter
) -> ch
[d
];
56 inline void update(int idx
, int pos
, int val
) {
58 root
[idx
] = Insert(root
[idx
],0,rlim
,pos
,val
);
63 int Query(int l
, int r
, int k
, std::vector
<node
*> lt
, std::vector
<node
*> rt
) {
65 int m
= (l
+ r
) >> 1, cnt
= getsum(rt
) - getsum(lt
);
73 return Query(l
,r
,k
,lt
,rt
);
76 inline int query(int l
, int r
, int k
) {
77 std::vector
<node
*> tree
[2];
80 return Query(0,rlim
,k
,tree
[0],tree
[1]);
84 std::scanf("%d%d",&n
,&m
);
85 for (int i
= 1,t
; i
<= n
; ++i
) {
86 std::scanf("%d",orig
+ i
);
92 std::scanf(" %c",&op
);
95 std::scanf("%d%d",&pos
,&num
);
96 update(pos
,orig
[pos
],-1);
97 update(pos
,orig
[pos
] = num
,1);
100 std::scanf("%d%d%d",&l
,&r
,&k
);
101 std::printf("%d\n",query(l
,r
,k
));