蒟蒻刚学主席树40pts求助
查看原帖
蒟蒻刚学主席树40pts求助
195331
Mine_KingCattleya楼主2021/2/23 11:38

RT,没用离散化,用的动态开点,只AC了#1,2,3,5,#10RE,其他WA,求大佬帮忙调一调/kel

#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 200005
#define Log 30
int n,m;
struct hjt_lint_tree
{
	int tot,cnt;
	int ls[Log*MAXN],rs[Log*MAXN];
	int l[Log*MAXN],r[Log*MAXN];
	int w[Log*MAXN];
	int rt[MAXN];
	int build(int ll,int rr)
	{
		tot++;
		ls[tot]=rs[tot]=0;
		l[tot]=ll;r[tot]=rr;
		w[tot]=0;
		return tot;
	}
	int change(int pre,int x,int ll,int rr)
	{
		int now=build(ll,rr);
		w[now]=w[pre];
		if(l[now]==r[now])
		{
			w[now]++;
			return now;
		}
		int mid=(l[now]+r[now])/2;
		if(x<=mid)
		{
			rs[now]=rs[pre];
			ls[now]=change(ls[pre],x,l[now],mid);
		}
		else
		{
			ls[now]=ls[pre];
			rs[now]=change(rs[pre],x,mid+1,r[now]);
		}
		w[now]=w[ls[now]]+w[rs[now]];
		return now;
	}
	int ask(int lt,int rt,int k)
	{
		int p=(lt==0?rt:lt);
		if(p==0) return 0;
		if(l[p]==r[p]){return l[p];}
		if(w[ls[rt]]-w[ls[lt]]>=k) return ask(ls[lt],ls[rt],k);
		else return ask(rs[lt],rs[rt],k-(w[ls[rt]]-w[ls[lt]]));
	}
}tr;
int main()
{
	scanf("%d%d",&n,&m);
	tr.rt[0]=tr.build(1,1000000000);
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%d",&x);
		tr.rt[i]=tr.change(tr.rt[i-1],x,1,1000000000);
	}
	for(int i=1;i<=m;i++)
	{
		int ll,rr,k;
		scanf("%d%d%d",&ll,&rr,&k);
		printf("%d\n",tr.ask(tr.rt[ll-1],tr.rt[rr],k));
	}
	return 0;
}
2021/2/23 11:38
加载中...