44分求助,不知道是不是没开long long 的原因
查看原帖
44分求助,不知道是不是没开long long 的原因
667180
Assassin_HG楼主2024/1/20 19:34
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 2e5+10;
int a[maxn],b[maxn],sum[maxn<<1],lc[maxn<<1],rc[maxn<<1],an[maxn];
int cnt,root,n,m,len;
void Push_up(int rt) {
	sum[rt] = sum[lc[rt]]+sum[rc[rt]];
}
void Modify(int &rt,int l,int r,int val) {
	if(!rt) {
		rt = ++cnt;
	}
	if(l==r) {
		sum[rt] = 1;
		return;
	}
	int mid = (l + r)>>1;
	if(val <= mid) {
		Modify(lc[rt],l,mid,val);
	} else {
		Modify(rc[rt],mid+1,r,val);
	}
	Push_up(rt);
}
int Ask(int rt,int l,int r,int k) {
	if(!rt) {
		return 0;
	}
	if(l == r) {
		return l;
	}
	int mid = (l+r)>>1;
	if(k <= sum[lc[rt]]) {
		return Ask(lc[rt],l,mid,k);
	} else {
		return Ask(rc[rt],mid+1,r,k-sum[lc[rt]]);
	}
}
void Disc() {
	scanf("%d%d",&n,&m);
	for(int i = 1; i <= n; ++i) {
		scanf("%d",&a[i]);
		b[i] = a[i];
	}
	for(int i = 1; i <= m; ++i) {
		scanf("%d",&an[i]);
	}
	sort(b+1,b+n+1);
	len = unique(b+1,b+n+1)-(b+1);
}
int get(int val) {
	return lower_bound(b+1,b+len+1,val) - b;
}
int main() {
	Disc();
	int op = 1;
	for(int i = 1; i <= n; ++i) {
		Modify(root,1,len,get(a[i]));
		while(an[op] == i && op <=m) {
			printf("%d\n",b[Ask(1,1,len,op)]);
			op++;
		}
	}
	return 0;
}
2024/1/20 19:34
加载中...