求助主席树
查看原帖
求助主席树
377440
Y2y7m楼主2022/5/11 00:24

最后两个点RE了,求大佬指导

#include <bits/stdc++.h>

using namespace std;
const int maxn=3e5+10;
int root[maxn],cnt;
struct node
{
	int ls,rs;
	int left,right;
	int s;
}t[20*maxn+100];
long long b[maxn];
struct node2
{
	long long x;
	int rk,id;
}a[maxn];
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
inline bool cmp1(node2 x,node2 y)
{
	return x.x<y.x;
}
bool cmp2(node2 x,node2 y)
{
	return x.id<y.id;
}
void build(int i,int left,int right)
{
	t[i].left=left;
	t[i].right=right;
	if(left==right)
		return ;
	int mid=(left+right)/2;
	t[i].ls=++cnt;
	build(cnt,left,mid);
	t[i].rs=++cnt;
	build(cnt,mid+1,right);
}
void insert(int pre,int now,int d)
{
	t[now]=t[pre],t[now].s++;
	if(t[now].left==t[now].right)
		return ;
	if(t[t[now].ls].right>=d)
	{
		t[now].ls=++cnt;
		insert(t[pre].ls,t[now].ls,d);
	}
	else
	{
		t[now].rs=++cnt;
		insert(t[pre].rs,t[now].rs,d);
	}
}
inline long long query(int pre,int now,int k)
{
	if(t[now].left==t[now].right)
		return t[now].left;
	if(t[t[now].ls].s-t[t[pre].ls].s>=k)
		return query(t[pre].ls,t[now].ls,k);
	else
		return query(t[pre].rs,t[now].rs,k-(t[t[now].ls].s-t[t[pre].ls].s));
}
int n,m;
signed main()
{
	cin>>n>>m;
	root[0]=++cnt;
	int mx=-1e9;
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i].x),a[i].id=i;
	sort(a+1,a+1+n,cmp1);
	for(int i=1;i<=n;i++)
		a[i].rk=i;
	sort(a+1,a+1+n,cmp2);
	build(1,1,n);
	for(int i=1;i<=n;i++)
	{
		root[i]=++cnt;
		insert(root[i-1],root[i],a[i].rk);		
	}
	for(int i=1;i<=n;i++)
		b[a[i].rk]=a[i].x;
	int l,r,k;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&l,&r,&k);
		printf("%d\n",b[query(root[l-1],root[r],k)]);
	}
	return 0;
}
2022/5/11 00:24
加载中...