主席树WA求助,马蜂良好
查看原帖
主席树WA求助,马蜂良好
965755
u______n楼主2023/11/7 15:35
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=400005;
int lc[N*33],rc[N*33],sum[N*33],V[N*33],cnt[N*33],root[N];
const int lim=2000000001;
const int S=1000000001;
int tot=0;
int insert(int p1,int p2,int l,int r,int v)
{
	if(r<l)
	return 0;
	p2=++tot;
	cnt[p2]=cnt[p1];
	int mid=(l+r)/2;
	V[p2]=mid;
	if(v<mid)
	{
	rc[p2]=rc[p1];
	lc[p2]=insert(lc[p1],lc[p2],l,mid-1,v);
	}
	else if(v>mid)
	{
	lc[p2]=lc[p1];
	rc[p2]=insert(rc[p1],rc[p2],mid+1,r,v);
	}
	else
	{
	cnt[p2]++;
	lc[p2]=lc[p1];rc[p2]=rc[p1];
	}
	sum[p2]=sum[lc[p2]]+sum[rc[p2]]+cnt[p2];
	return p2;
}
int query(int p1,int p2,int k)
{
	while(1)
	{
		int s1=sum[lc[p2]]-sum[lc[p1]];
		int s2=cnt[p2]-cnt[p1];
		if(s1>k||(s1==k&&s2==0))
		{
			p1=lc[p1];
			p2=lc[p2];
		}
		else if(s1+s2<k)
		{
			p1=rc[p1];
			p2=rc[p2];
			k-=s1+s2;
		}
		else
		return V[p2];
	}
}
signed main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		int v;
		cin>>v;
		v+=S;
		root[i]=insert(root[i-1],0,1,lim,v);	
	}
	for(int i=1;i<=m;i++)
	{
		int l,r,k;
		cin>>l>>r>>k;
		cout<<query(root[l-1],root[r],k)-S<<endl;
	}
	return 0;
}

错误情况是在比较靠后的询问会WA

2023/11/7 15:35
加载中...