写这类题目一定要开准数组大小……
// luogu-judger-enable-o2
#include <bits/stdc++.h>
using namespace std;
const int N = 200000000;
int n,m,t1,t2,t3,t4;
int a[30000005],ch[30000005][2],inner_ind,outer_ind,b[8000005],Ch[8000005][2],ROOT,seq[8000005];
void inner_pushup(int p) {
a[p]=a[ch[p][0]]+a[ch[p][1]];
}
void inner_modify(int &p,int l,int r,int pos,int key) {
if(p==0) p=++inner_ind;
if(l==r) {
a[p]+=key;
}
else {
if(pos<=(l+r)/2) inner_modify(ch[p][0],l,(l+r)/2,pos,key);
else inner_modify(ch[p][1],(l+r)/2+1,r,pos,key);
inner_pushup(p);
}
}
int inner_query(int p,int l,int r,int ql,int qr) {
if(l>qr||r<ql) return 0;
if(l>=ql && r<=qr) return a[p];
return inner_query(ch[p][0],l,(l+r)/2,ql,qr) + inner_query(ch[p][1],(l+r)/2+1,r,ql,qr);
}
void outer_modify(int &p,int l,int r,int opos,int ipos,int ikey) {
if(p==0) {
p=++outer_ind;
}
inner_modify(b[p],1,n,ipos,ikey);
if(r-l) {
if(opos<=(l+r)/2) outer_modify(Ch[p][0],l,(l+r)/2,opos,ipos,ikey);
else outer_modify(Ch[p][1],(l+r)/2+1,r,opos,ipos,ikey);
}
}
void outer_modify(int l,int r,int opos,int ipos,int ikey) {
outer_modify(ROOT,l,r,opos+2,ipos,ikey);
}
int outer_query(int p,int l,int r,int ql,int qr,int iql,int iqr) {
if(l>qr||r<ql) return 0;
if(l>=ql && r<=qr) return inner_query(b[p],1,n,iql,iqr);
return outer_query(Ch[p][0],l,(l+r)/2,ql,qr,iql,iqr)+outer_query(Ch[p][1],(l+r)/2+1,r,ql,qr,iql,iqr);
}
int outer_query(int l,int r,int ql,int qr,int iql,int iqr) {
return outer_query(ROOT,l,r,ql+2,qr+2,iql,iqr);
}
int outer_kth(int p,int l,int r,int k,int iql,int iqr) {
if(l==r) return r;
int tmp=0;
if(Ch[p][0] && (tmp=inner_query(b[Ch[p][0]],1,n,iql,iqr))>=k )
return outer_kth(Ch[p][0],l,(l+r)/2,k,iql,iqr);
else
return outer_kth(Ch[p][1],(l+r)/2+1,r,k-tmp,iql,iqr);
}
int outer_kth(int l,int r,int k,int iql,int iqr) {
return outer_kth(ROOT,l,r,k,iql,iqr)-2;
}
int main() {
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1; i<=n; i++) {
cin>>t1; seq[i]=t1;
outer_modify(1,N,t1,i,1);
}
for(int i=1; i<=m; i++) {
cin>>t1;
if(t1==1) {
cin>>t2>>t3>>t4;
cout<<outer_query(1,N,0,t4-1,t2,t3)+1<<endl;
}
if(t1==2) {
cin>>t2>>t3>>t4;
cout<<outer_kth(1,N,t4,t2,t3)<<endl;
}
if(t1==3) {
cin>>t2>>t3;
outer_modify(1,N,seq[t2],t2,-1);
outer_modify(1,N,t3,t2,1);
seq[t2]=t3;
}
if(t1==4) {
cin>>t2>>t3>>t4;
int k=outer_query(1,N,0,t4-1,t2,t3);
if(k<=0) cout<<-2147483647<<endl;
else cout<<outer_kth(1,N,k,t2,t3)<<endl;
}
if(t1==5) {
cin>>t2>>t3>>t4;
int k=outer_query(1,N,0,t4,t2,t3)+1;
if(k>(t3-t2+1)) cout<<2147483647<<endl;
else cout<<outer_kth(1,N,k,t2,t3)<<endl;
}
}
}
来源:oschina
链接:https://my.oschina.net/u/4385831/blog/4044720