萌新求助只过了前两个点
查看原帖
萌新求助只过了前两个点
544780
dodo487楼主2023/1/8 19:52

剩下全部WA```cpp #include<bits/stdc++.h> using namespace std; const int N=200010; struct tree{ int l,r,ls,rs,val; }a[N<<5]; int s[N],ss[N],cnt,root[N]; int build(int p,int l,int r){ p = ++cnt; a[p].l=l,a[p].r=r; if(l==r) return p; int mid=(l+r)>>1; a[p].ls=build(0,l,mid); a[p].rs=build(0,mid+1,r); return p; }

int change(int p,int k){ a[++cnt]=a[p]; p=cnt;//新建点

int l=a[p].l,r=a[p].r;
if(l==r){
	a[p].val=1;
	return p;
}
int mid=(l+r)>>1;
if(k<=mid) a[p].ls=change(a[p].ls,k);
else a[p].rs=change(a[p].rs,k);

a[p].val=a[a[p].ls].val+a[a[p].rs].val;//pushup 
return p;

}

int quest(int x,int y,int k){ if(a[x].l==a[x].r) return a[x].l; int temp=a[a[y].ls].val-a[a[x].ls].val; if(k<=temp) return quest(a[x].ls,a[y].ls,k); else return quest(a[x].rs,a[y].rs,k-temp); }

int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&s[i]),ss[i]=s[i];

sort(ss+1,ss+1+n);
int num=unique(ss+1,ss+1+n)-ss-1;
root[0]=build(1,1,num);
for(int i=1;i<=n;i++){
	s[i]=lower_bound(ss+1,ss+1+num,s[i])-ss;
	root[i]=change(root[i-1],s[i]);
}//离散化,插入 

for(int i=1;i<=m;i++){
	int x,y,k;
	scanf("%d%d%d",&x,&y,&k);
	printf("%d\n",ss[quest(root[x-1],root[y],k)]);
}

}

2023/1/8 19:52
加载中...