Thụ trạng số tổ bộ quyền giá trị đoạn thẳng thụ

Trạng thái tĩnh khu gian k tiểu giá trị ( POJ 2104 K-th Number )Vấn đề có thể dùngQuyền giá trị đoạn thẳng thụThời gian phức tạp độ nội giải quyết.

Nếu khu gian biến thành động thái đâu? Tức, nếu còn yêu cầu duy trì một loại thao tác: Đơn điểm sửa chữa mỗ một vị thượng giá trị, lại nên làm cái gì bây giờ đâu?

Ví dụ mẫuNhị bức cân bằng thụ ( thụ bộ thụ )
Ví dụ mẫuZOJ 2112 Dynamic Rankings

Nếu dùngĐoạn thẳng thụ bộ cân bằng thụTrung sở trình bày và phân tích, dùng đoạn thẳng thụ bộ cân bằng thụ, tức đối với đoạn thẳng thụ mỗi một cái tiết điểm, đối với này sở tỏ vẻ khu gian giữ gìn một cái cân bằng thụ, sau đó dùng nhị phân tới tra tìmTiểu giá trị. Bởi vì mỗi lần tuần tra thao tác đều phải bao trùm nhiều khu gian, tức có bao nhiêu cái tiết điểm, nhưng là cân bằng thụ cũng không thể nhiều giá trị cùng nhau tra tìm, cho nên thời gian phức tạp độ là,Cũng không phải tối ưu.

Ưu hoá ý nghĩ là đem nhị phân đáp án thao tác cùng tuần tra nhỏ hơn một cái giá trị số số lượng hai loại thao tác kết hợp lên, sử dụngĐoạn thẳng thụ bộ động thái khai điểm quyền giá trị đoạn thẳng thụ,Bởi vì sở hữu đoạn thẳng thụ kết cấu là tương đồng, có thể ở nhiều cây thượng đồng thời tiến hành đoạn thẳng trên cây nhị phân.

Ở sửa chữa thao tác tiến hành khi, trước tiên ở đoạn thẳng trên cây từ trên xuống dưới nhảy đến bị sửa chữa điểm, xóa bỏ sở trải qua điểm sở chỉ hướng động thái khai điểm quyền giá trị đoạn thẳng trên cây nguyên lai giá trị, sau đó cắm vào tân giá trị, phải trải quaCái đoạn thẳng trên cây tiết điểm, ở động thái khai điểm quyền giá trị đoạn thẳng trên cây một lần sửa chữa thao tác là,Cho nên sửa chữa thao tác thời gian phức tạp độ vì.

Ở tuần tra đáp án khi, trước lấy ra nên khu gian bao trùm tại tuyến đoạn trên cây sở hữu điểm, sau đó dùng cùng loại với trạng thái tĩnh khu gianTiểu giá trị phương pháp, đem này đó điểm cùng nhau hướng tả nhi tử hoặc hướng hữu nhi tử nhảy. Nếu sở hữu này đó điểm tả nhi tử tồn trữ giá trị lớn hơn hoặc bằng,Tắc hướng tả nhảy, nếu không hướng hữu nhảy. Bởi vì nhiều nhất chỉ có thể bao trùmCái tiết điểm, cho nên nhiều nhất một lần chỉ có nhiều như vậy cái tiết điểm xuống phía dưới nhảy, thời gian phức tạp độ vì.

Bởi vì đoạn thẳng thụ hằng số trọng đại, ở thực hiện trung thường thường sử dụng hằng số càng tiểu thả càng phương tiện xử lý tiền tố cùngThụ trạng số tổThực hiện. Mặt khác không gian phức tạp độ là,Sử dụng khiChú ý không gian hạn chế.

Cấp ra một loại số hiệu thực hiện:

Thực hiện
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include&LTalgorithm>
#include&LTcstdio>
#include&LTcstring>
#include&LTmap>
#include&LTset>
#define LC o
#define RC o
usingnamespacestd;
constintmaxn=1000010;
intn,m,a[maxn],u[maxn],x[maxn],l[maxn],r[maxn],k[maxn],cur,cur1,cur2,
q1[maxn],q2[maxn],v[maxn];
charop[maxn];
setint>ST;
mapint,int>mp;

structsegment_tree// phong trang động thái khai điểm quyền giá trị đoạn thẳng thụ
{
intcur,rt[maxn*4],sum[maxn*60],lc[maxn*60],rc[maxn*60];

voidbuild(int&o){o=++cur;}

voidprint(into,intl,intr){
if(!o)return;
if(l==r&&sum[o])printf("%d",l);
intmid=(l+r)>>1;
print(lc[o],l,mid);
print(rc[o],mid+1,r);
}

voidupdate(int&o,intl,intr,intx,intv){
if(!o)o=++cur;
sum[o]+=v;
if(l==r)return;
intmid=(l+r)>>1;
if(xmid)
update(lc[o],l,mid,x,v);
else
update(rc[o],mid+1,r,x,v);
}
}st;

// thụ trạng số tổ thực hiện
intlowbit(into){return(o&(-o));}

voidupd(into,intx,intv){
for(;on;o+=lowbit(o))st.update(st.rt[o],1,n,x,v);
}

voidgtv(into,int*A,int&p){
p=0;
for(;o;o-=lowbit(o))A[++p]=st.rt[o];
}

intqry(intl,intr,intk){
if(l==r)returnl;
intmid=(l+r)>>1,siz=0;
for(inti=1;icur1;i++)siz+=st.sum[st.lc[q1[i]]];
for(inti=1;icur2;i++)siz-=st.sum[st.lc[q2[i]]];
// printf( "j %d %d %d %d\n",cur1,cur2,siz,k);
if(siz>=k){
for(inti=1;icur1;i++)q1[i]=st.lc[q1[i]];
for(inti=1;icur2;i++)q2[i]=st.lc[q2[i]];
returnqry(l,mid,k);
}else{
for(inti=1;icur1;i++)q1[i]=st.rc[q1[i]];
for(inti=1;icur2;i++)q2[i]=st.rc[q2[i]];
returnqry(mid+1,r,k-siz);
}
}

/* đoạn thẳng thụ thực hiện
void build(int o,int l,int r)
{
st.build(st.rt[o]);
if(l==r)return;
int mid=(l+r)>>1;
build(LC,l,mid);
build(RC,mid+1,r);
}
void print(int o,int l,int r)
{
printf( "%d %d:",l,r);
st.print(st.rt[o],1,n);
printf( "\n" );
if(l==r)return;
int mid=(l+r)>>1;
print(LC,l,mid);
print(RC,mid+1,r);
}
void update(int o,int l,int r,int q,int x,int v)
{
st.update(st.rt[o],1,n,x,v);
if(l==r)return;
int mid=(l+r)>>1;
if(q
else update(RC,mid+1,r,q,x,v);
}
void getval(int o,int l,int r,int ql,int qr)
{
if(l>qr||r&LTql)return;
if(ql
int mid=(l+r)>>1;
getval(LC,l,mid,ql,qr);
getval(RC,mid+1,r,ql,qr);
}
int query(int l,int r,int k)
{
if(l==r)return l;
int mid=(l+r)>>1,siz=0;
for(int i=1;i
if(siz>=k)
{
for(int i=1;i
return query(l,mid,k);
}
else
{
for(int i=1;i
return query(mid+1,r,k-siz);
}
}
*/

intmain(){
scanf("%d%d",&n,&m);
for(inti=1;in;i++)scanf("%d",a+i),ST.insert(a[i]);
for(inti=1;im;i++){
scanf("%c",op+i);
if(op[i]=='C')
scanf("%d%d",u+i,x+i),ST.insert(x[i]);
else
scanf("%d%d%d",l+i,r+i,k+i);
}
for(setint>::iteratorit=ST.begin();it!=ST.end();it++)
mp[*it]=++cur,v[cur]=*it;
for(inti=1;in;i++)a[i]=mp[a[i]];
for(inti=1;im;i++)
if(op[i]=='C')x[i]=mp[x[i]];
n+=m;
// build(1,1,n);
for(inti=1;in;i++)upd(i,a[i],1);
// print(1,1,n);
for(inti=1;im;i++){
if(op[i]=='C'){
upd(u[i],a[u[i]],-1);
upd(u[i],x[i],1);
a[u[i]]=x[i];
}else{
gtv(r[i],q1,cur1);
gtv(l[i]-1,q2,cur2);
printf("%d\n",v[qry(1,n,k[i])]);
}
}
return0;
}