主席树板子MLE on #9 #10 /kk
查看原帖
主席树板子MLE on #9 #10 /kk
261417
asasas楼主2022/9/7 22:49
#include <bits/stdc++.h>
using namespace std;
struct czmg{
	int l,r,s,lch,rch;
}tr[7000005];
int cnt,a[300005],n,m,b[300005],root[300005]; 
int clone(int u){
	tr[++cnt]=tr[u];
	return cnt;
}
void pushup(int u){
	tr[u].s=tr[tr[u].lch].s+tr[tr[u].rch].s;
}
int build(int l,int r){
	int u=++cnt;
	tr[u].l=l,tr[u].r=r;
	if (l==r) return u;
	int mid=(l+r)/2;
	tr[u].lch=build(l,mid);
	tr[u].rch=build(mid+1,r);
	return u;
}
int update(int x,int u){
	u=clone(u);
	int l=tr[u].l,r=tr[u].r;
	if (l==r){
		tr[u].s++;
		return u;
	}
	int mid=(l+r)/2;
	if (mid>=x) tr[u].lch=update(x,tr[u].lch);
	else tr[u].rch=update(x,tr[u].rch);
	pushup(u);
	return u;
}
int getsum(int x,int u1,int u2){
	if (tr[u1].l==tr[u1].r) return tr[u1].l;
	int mid=tr[tr[u2].lch].s-tr[tr[u1].lch].s;
	if (mid>=x) return getsum(x,tr[u1].lch,tr[u2].lch);
	else return getsum(x-mid,tr[u1].rch,tr[u2].rch);
} 
int main(){
//	freopen("czmg.in","r",stdin);
//	freopen("czmg.out","w",stdout);
    ios::sync_with_stdio(0);
	cin >> n >> m;
	for (register int i=1;i<=n;i++) cin >> a[i],b[i]=a[i];
    sort(b+1,b+1+n);
    int len=unique(b+1,b+1+n)-b-1;
    root[0]=build(1,n);
    for (register int i=1;i<=n;i++){
    	a[i]=lower_bound(b+1,b+1+len,a[i])-b;
    	root[i]=update(a[i],root[i-1]);
	}
	while(m--){
		int l,r,k;
		cin >>  l >> r >> k;
		cout << b[getsum(k,root[l-1],root[r])] << endl;
	}
}
2022/9/7 22:49
加载中...