TLE求助玄关
查看原帖
TLE求助玄关
777848
superkkkeee楼主2024/12/7 16:05

RT

#include<bits/stdc++.h>
using namespace std;
#define mid ((l+r)>>1ll)
#define ls(x) (x<<1ll)
#define rs(x) (x<<1ll|1ll)
int n,m;
int s[300001<<2];
struct nnode
{
	int v,id;
}a[300001];
struct node
{
	int l,r,k,id;
}q[300001];
int ans[300001];
int num[300001];
int fk[300001];
bool cmp(nnode x,nnode y)
{
	return x.v<y.v;
}
bool cmpp(node x,node y)
{
	if(fk[x.l]==fk[y.l]) return x.r<y.r;
	return x.l<y.l;
}
void push_up(int p)
{
	s[p]=s[ls(p)]+s[rs(p)];
}
void add(int rt,int l,int r,int k,int c)
{
	if(l==k&&r==k){s[rt]+=c;return;}
	s[rt]+=c;
	if(k<=mid)add(ls(rt),l,mid,k,c);
	else add(rs(rt),mid+1,r,k,c);
	push_up(rt);
}
int ask(int rt,int l,int r,int k)
{
	if(l==r)return l;
	if(s[ls(rt)]>=k)return ask(ls(rt),l,mid,k);
	else return ask(rs(rt),mid+1,r,k-s[rt<<1]);
}
void md()
{
	int l=1,r=0;
	for(int i=1;i<=m;i++)
	{
		while(r<q[i].r) add(1,1,n,num[++r],1);
		while(r>q[i].r) add(1,1,n,num[r--],-1);
		while(l<q[i].l) add(1,1,n,num[l++],-1);
		while(l>q[i].l) add(1,1,n,num[--l],1);
		ans[q[i].id]=a[ask(1,1,n,q[i].k)].v;
	}
}
signed main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i].v,a[i].id=i;
	int f=sqrt(n);
	for(int i=1;i<=n;i++) fk[i]=(i-1)/f+1;
	sort(a+1,a+1+n,cmp); 
	for(int i=1;i<=n;i++) num[a[i].id]=i;
	for(int i=1;i<=m;i++)
	{
		cin>>q[i].l>>q[i].r>>q[i].k;
		q[i].id=i;
	}
	sort(q+1,q+1+m,cmpp);
	md();
	for(int i=1;i<=m;i++) cout<<ans[i]<<'\n';
	return 0;
}
2024/12/7 16:05
加载中...