全RE求助
查看原帖
全RE求助
186573
Boring__Zheng楼主2021/11/16 22:32

本地能跑过,洛谷ide也可以,但是洛谷ide开o2就RE了,交洛谷评测机不开O2也RE,求大佬帮忙康康

#include<bits/stdc++.h>
using namespace std;

const int N=2e5+5;
struct HLTree
{
	struct Tree { int l,r,lc,rc,val; } tree[N*30];
	int cnt;
	inline void build(int id,int l,int r)
	{
		tree[id].l=l; tree[id].r=r;	tree[id].val=0;
		if( l==r ) { tree[id].val=0; return; }
		int mid=l+r>>1;
		tree[id].lc=++cnt; tree[id].rc=++cnt;
		build(tree[id].lc,l,mid); build(tree[id].rc,mid+1,r);
	}
	inline void Insert(int id,int id1,int l,int r,int k)
	{
		tree[id].l=l; tree[id].r=r;
		if( l==r ) { tree[id].val=tree[id1].val+1; return; }
		int mid=l+r>>1;
		if( k <= mid ) tree[id].rc=tree[id1].rc,tree[id].lc=++cnt,Insert(cnt,tree[id1].lc,l,mid,k);
		else tree[id].lc=tree[id1].lc,tree[id].rc=++cnt,Insert(cnt,tree[id1].rc,mid+1,r,k);
		tree[id].val=tree[tree[id].lc].val+tree[tree[id].rc].val;
	}
	inline int query(int id,int id1,int k)
	{
		if( tree[id].l==tree[id].r ) return tree[id].l;
		int tem=tree[tree[id1].lc].val-tree[tree[id].lc].val;
		if( k <= tem ) return query(tree[id].lc,tree[id1].lc,k);
		else query(tree[id].rc,tree[id1].rc,k-tem);
	}
}t;
struct Node
{
	int a,id;
}a[N];
int rk[N],num[N],rt[N];

inline int read()
{
	int x=0,f=1; char ch=getchar();
	while( ch < '0' or ch > '9' ) f *= ch=='-' ? -1 : 1, ch=getchar();
	while( ch >= '0' and ch <= '9' ) x=x*10+ch-'0', ch=getchar();
	return x*f;
}

inline bool cmp(Node x,Node y) { return x.a < y.a; }

int main()
{
	int n=read(),m=read();
	for(int i=1;i<=n;i++) a[i].a=read(), a[i].id=i;
	sort(a+1,a+n+1,cmp);
	int tot=0; t.cnt=0;
	for(int i=1;i<=n;i++)
		if( a[i].a==a[i-1].a ) rk[a[i].id]=tot;
		else rk[a[i].id]=++tot,num[tot]=a[i].a;
	rt[0]=++t.cnt;
	t.build(rt[0],1,tot);
	for(int i=1;i<=n;i++)
	{
		rt[i]=++t.cnt;
		t.Insert(rt[i],rt[i-1],1,tot,rk[i]);
	}
	while( m-- )
	{
		int l=read(),r=read(),k=read();
		printf("%d\n",num[t.query(rt[l-1],rt[r],k)]);
	}
	return 0;
}
2021/11/16 22:32
加载中...