主席树 10分求助
查看原帖
主席树 10分求助
227728
冰糖鸽子「僕は…」楼主2021/1/24 20:02

RT,只过了第一个点


// Problem: P3834 【模板】可持久化线段树 2(主席树)
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3834
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

#include <bits/stdc++.h>
using namespace std;
#define M 200005
int n,m,cntp,a[M],r[M],f[M],x,y,k;
struct node
{
	int fl,ll,rr,fr,v;
}t[M*30],b[M];
bool cmp(node a,node b)
{
	return a.v<b.v;
}
int build(int l,int r)
{
	int res=++cntp;
	t[res].ll=l;t[res].rr=r;
	if(l==r) return res;
	int mid=(l+r)/2;
	t[res].fl=build(l,mid);
	t[res].fr=build(mid+1,r);
	return res;
}
int ins(int x,int l,int r,int fat)
{
	int res=++cntp;
	t[res]=t[fat];t[res].v++;
	if(l==r)
	{
		return res;
	}
	int mid=(l+r)/2;
	if(mid>=x)
	{
		t[res].fl=ins(x,l,mid,t[fat].fl);
	}
	else
	{
		t[res].fr=ins(x,mid+1,r,t[fat].fr);
	}
	return res;
}
void Query(int A,int B,int k)
{
	if(t[A].ll==t[A].rr)
	{
		cout<<b[t[A].ll].v<<endl;
		return;
	}
	int lnow=(t[t[B].fl].v-t[t[A].fl].v);
	if(lnow>=k)
	{
		Query(t[A].fl,t[B].fl,k);
	}
	else
	{
		Query(t[A].fr,t[B].fr,k);
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>b[i].v;
		a[i]=b[i].v;
		b[i].fr=i;
	}
	sort(b+1,b+1+n,cmp);
	for(int i=1;i<=n;i++)
	{
		f[b[i].fr]=i;
	}
	r[0]=build(1,n);
	for(int i=1;i<=n;i++)
	{
		r[i]=ins(f[i],1,n,r[i-1]);
	}
	for(int i=1;i<=m;i++)
	{
		cin>>x>>y>>k;
		Query(r[x-1],r[y],k);
	}
	return 0;
}
2021/1/24 20:02
加载中...