板子不解释
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cstring> 6 using namespace std; 7 const int N=50010, inf=2147483647; 8 int n, m, a[N], b[N<<1], cnt; 9 int rt[N], idx, ch[N<<8][2], sz[N<<8], xx[N], yy[N], totx, toty; 10 #define ls(o) ch[o][1] 11 #define rs(o) ch[o][2] 12 13 void ins(int &o, int x, int v, int l=1, int r=cnt){ 14 if(!o) o=++idx; sz[o]+=v; if(l == r) return ; int mid=l+r>>1; 15 if(x <= mid) ins(ls(o), x, v, l, mid); else ins(rs(o), x, v, mid+1, r); 16 } 17 void modify(int x, int v){ 18 int k=lower_bound(b+1, b+cnt+1, a[x])-b; 19 for(int i=x; i <= n; i+=i&(-i)) ins(rt[i], k, v); 20 } 21 22 void getsum(int &sum){for(int i=1; i <= totx; i++) sum-=sz[ls(xx[i])]; for(int i=1; i <= toty; i++) sum+=sz[ls(yy[i])];} 23 void getls(){for(int i=1; i <= totx; i++) xx[i]=ls(xx[i]); for(int i=1; i <= toty; i++) yy[i]=ls(yy[i]);} 24 void getrs(){for(int i=1; i <= totx; i++) xx[i]=rs(xx[i]); for(int i=1; i <= toty; i++) yy[i]=rs(yy[i]);} 25 void prepare(int L, int R){for(int i=L-1; i; i-=i&-i) xx[++totx]=rt[i]; for(int i=R; i; i-=i&-i) yy[++toty]=rt[i];} 26 int find_kth(int k, int l=1, int r=cnt){ 27 if(l == r) return l; int mid=l+r>>1, ss=0; getsum(ss); 28 if(ss >= k) {getls(); return find_kth(k, l, mid);} 29 getrs(); return find_kth(k-ss, mid+1, r); 30 } 31 void Find_kth(int L, int R, int K){totx=toty=0; prepare(L, R); printf("%d\n", b[find_kth(K)]);} 32 33 int get_rank(int o, int x, int l=1, int r=cnt){ 34 if(!o) return 0; if(l == r) { return 0; return sz[o];} int mid=l+r>>1; 35 if(x <= mid) return get_rank(ls(o), x, l, mid); return sz[ls(o)]+get_rank(rs(o), x, mid+1, r); 36 } 37 void Get_rank(int L, int R, int c){ 38 int ss=0, x=lower_bound(b+1, b+1+cnt, c)-b; 39 for(int i=L-1; i; i-=i&-i) ss-=get_rank(rt[i], x); 40 for(int i=R; i; i-=i&-i) ss+=get_rank(rt[i], x); 41 printf("%d\n", ss+1); 42 } 43 44 void Get_pre(int L, int R, int c){ 45 int ss=0, x=lower_bound(b+1, b+1+cnt, c)-b; 46 for(int i=L-1; i; i-=i&-i) ss-=get_rank(rt[i], x); 47 for(int i=R; i; i-=i&-i) ss+=get_rank(rt[i], x); 48 if(!ss) printf("%d\n", -inf); 49 else Find_kth(L, R, ss); 50 } 51 void Get_post(int L, int R, int c){ 52 int ss=0, x=lower_bound(b+1, b+1+cnt, c)-b+1; 53 for(int i=L-1; i; i-=i&-i) ss-=get_rank(rt[i], x); 54 for(int i=R; i; i-=i&-i) ss+=get_rank(rt[i], x); 55 if(ss > R-L) printf("%d\n", inf); 56 else Find_kth(L, R, ss+1); 57 } 58 59 int read(){ 60 int out=0, f=1; char c=getchar(); 61 while(c < '0' || c > '9') {if(c == '-') f=-1; c=getchar();} 62 while(c >= '0' && c <= '9') {out=(out<<1)+(out<<3)+c-'0'; c=getchar();} 63 return out*f; 64 } 65 66 int cmd[N], ql[N], qr[N], qk[N]; 67 void solve() 68 { 69 n=read(); m=read(); 70 for(int i=1; i <= n; i++) a[i]=read(), b[++cnt]=a[i]; 71 for(int i=1; i <= m; i++) { 72 cmd[i]=read(), ql[i]=read(), qr[i]=read(); 73 if(cmd[i] != 3) qk[i]=read(); 74 if(cmd[i] == 3) b[++cnt]=qr[i]; 75 else if(cmd[i] != 2) b[++cnt]=qk[i]; 76 } 77 sort(b+1, b+cnt+1); cnt=unique(b+1, b+cnt+1)-b-1; 78 for(int i=1; i <= n; i++) modify(i, 1); 79 for(int i=1; i <= m; i++){ 80 if(cmd[i] == 1) Get_rank(ql[i], qr[i], qk[i]); 81 if(cmd[i] == 2) Find_kth(ql[i], qr[i], qk[i]); 82 if(cmd[i] == 3) modify(ql[i], -1), a[ql[i]]=qr[i], modify(ql[i], 1); 83 if(cmd[i] == 4) Get_pre(ql[i], qr[i], qk[i]); 84 if(cmd[i] == 5) Get_post(ql[i], qr[i], qk[i]); 85 } 86 } 87 88 int main() 89 { 90 solve(); 91 return 0; 92 }