萌新求助主席树
查看原帖
萌新求助主席树
174897
zjrdmd楼主2021/7/23 20:43

RT,全都RE了,但是本地下载数据测试并没有问题。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <stdlib.h>
#include <stack>
#include <queue>
#define ri register int

using std::min;
using std::max;

inline int read() {
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}

const int N=4e5+5;
struct Seg_Tree{
	int ls,rs,sum;
}tree[N*20];
int n,m,a[N],b[N],frm[N],root[N],ne;
 
int Find(int x){
	int l=1,r=n,ans=0;
	while(l<=r){
		int mid=l+r>>1;
		if(b[mid]>=x)r=mid-1,ans=mid;
		else l=mid+1;
	}
	return ans;
}

void Push_Up(int now){
	int ls=tree[now].ls,rs=tree[now].rs;
	tree[now].sum=tree[ls].sum+tree[rs].sum;
}

void Add(int las,int now,int x,int l,int r,int fa,int opt,int p){
	if(l>x||r<x||l>r)return;
	if(!now){
		++ne,now=ne;
		if(fa){
			if(!opt)tree[fa].ls=now;
	        else tree[fa].rs=now;
	    }
	}
//	printf("%d %d %d %d %d %d %d %d\n",las,now,x,l,r,fa,opt,p);
	if(l==r){tree[now].sum+=1;return;}
	int mid=l+r>>1;	
	if(mid>=x)Add(tree[las].ls,tree[now].ls,x,l,mid,now,0,p),tree[now].rs=tree[las].rs;
	else Add(tree[las].rs,tree[now].rs,x,mid+1,r,now,1,p),tree[now].ls=tree[las].ls;
	Push_Up(now);
	if(l==1&&r==n)root[p]=now;
}

int Query(int nowl,int nowr,int l,int r,int k){
	if(l==r)return l;
	int mid=l+r>>1,tmp=tree[tree[nowr].ls].sum-tree[tree[nowl].ls].sum;
	if(tmp<k)Query(tree[nowl].rs,tree[nowr].rs,mid+1,r,k-tmp);
	else Query(tree[nowl].ls,tree[nowr].ls,l,mid,k);
}

int main(){
	n=read(),m=read();
	for(ri i=1;i<=n;i++)b[i]=a[i]=read();
	std::sort(b+1,b+n+1);
	for(ri i=1,x;i<=n;i++)x=Find(a[i]),frm[x]=a[i],a[i]=x;
	for(ri i=1;i<=n;i++){
		Add(root[i-1],0,a[i],1,n,0,0,i);
	}
	for(ri i=1;i<=m;i++){
		int l=read(),r=read(),k=read();
		printf("%d\n",frm[Query(root[l-1],root[r],1,n,k)]);
	}
	return 0;
}


2021/7/23 20:43
加载中...