求助,请问root[x-1]为什么要减一?
查看原帖
求助,请问root[x-1]为什么要减一?
551706
Ye_zhui_Yi楼主2022/2/3 22:48
#include<bits/stdc++.h>
#define re register
#define mod 998244353
#define inf 0x7f7f7f7f
#define MAXN 1000100
#define mid (l+r)/2
#define int long long
using namespace std;
template < typename T > inline void read( T &x )
{
	x = 0 ; int w = 1 ; char ch = getchar() ;
	while( ! isdigit( ch ) ) { if( ch == '-' ) w = -1 ; ch = getchar() ; }
	while( isdigit( ch ) ) x = ( x << 1 ) + ( x << 3 ) + ( ch ^ 48 ) , ch = getchar() ;
	x *= w ;
	return ;
}
template < typename T > inline void write( T x )
{
	if( x < 0 )
		putchar('-') , x = -x ;
	if( x == 0 )
	{
		putchar('0') ;
		return ;
	}
	if( x > 9 )
		write( x / 10 ) ;
	putchar( x % 10 + '0' ) ;
	return ;
}
int sum[MAXN<<5],L[MAXN<<5],R[MAXN<<5],cnt;
inline int build(int l,int r)
{
	int rt=++cnt;
	sum[rt]=0;
	if(l<r)
	{
		L[rt]=build(l,mid);
		R[rt]=build(mid+1,r);
	}
	return rt;
}
inline int update(int p,int l,int r,int x)
{
	int rt=++cnt;
	L[rt]=L[p],R[rt]=R[p],sum[rt]=sum[p]+1;
	if(l<r)
	{
		if(x<=mid) L[rt]=update(L[p],l,mid,x);
		else R[rt]=update(R[p],mid+1,r,x);
	}
	return rt;
}
inline int query(int u,int v,int l,int r,int k)
{
	if(l==r)
		return l;
	int x=sum[L[v]]-sum[L[u]];
	if(x>=k) return query(L[u],L[v],l,mid,k);
	else return query(R[u],R[v],mid+1,r,k-x);
}
int n,m,q,root[MAXN],a[MAXN],b[MAXN];
signed main()
{
	read(n),read(m);
	for(int i=1;i<=n;i++)
	{
		read(a[i]);
		b[i]=a[i];
	}
	sort(b+1,b+1+n);
	q=unique(b+1,b+1+n)-b-1;
	root[0]=build(1,q);
	for(int i=1;i<=n;i++)
	{
		int t=lower_bound(b+1,b+1+q,a[i])-b;
		root[i]=update(root[i-1],1,q,t);
	}
	for(int i=1;i<=m;i++)
	{
		int x,y,z;
		read(x),read(y),read(z);
		int t=query(root[x-1],root[y],1,q,z);
		write(b[t]);putchar('\n');
	}
	return 0 ;
}
2022/2/3 22:48
加载中...