$\color{black}qaq$
  • 板块P1533 可怜的狗狗
  • 楼主JJA_
  • 当前回复12
  • 已保存回复12
  • 发布时间2021/4/19 19:35
  • 上次更新2023/11/5 00:20:31
查看原帖
$\color{black}qaq$
352464
JJA_楼主2021/4/19 19:35

无旋Treap离线,样例过不去,调不大出来(

本人刚学离线,轻喷(

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<queue>
//#include<map>
#include<vector>
#include<math.h>
using namespace std;
#define int long long
#define forr(i,a,b) for(int i=a;i<=b;i++)
#define repp(i,a,b) for(int i=a;i>=b;i--)
#define INF 1e9
#define ll long long
#define MAXN 1000006
const int _x[]={0,1,0,-1,0},_y[]={0,0,1,0,-1};
#define mem(a,n) memset(a,n,sizeof(a));
#define chkmax(a,b) a=a>b?a:b;
#define chkmin(a,b) a=a<b?a:b;
#include<set>
#include<stack>
#define lc tree[i].l
#define rc tree[i].r
int root,cnt;
struct FHQtree{
	int l,r;
	int size,key;
	int val;
}tree[MAXN*4];
void update(int i){
	tree[i].size=tree[lc].size+tree[rc].size+1;
}
int add(int i){
	tree[++cnt].val=i;
	tree[cnt].key=rand();
	tree[cnt].size=1;
	return cnt;
}
void split(int i,int k,int &l,int &r){
	if(!i){
		l=r=0;
		return;
	}
	if(tree[i].val<=k){
		l=i;
		split(rc,k,rc,r);
	}
	else{
		r=i;
		split(lc,k,l,lc);
	}
	update(i);
}
int merge(int l,int r){
	if(!l||!r){
		return l+r;
	}
	if(tree[l].key<=tree[r].key){
		tree[l].r=merge(tree[l].r,r);
		update(l);
		return l;
	}
	else if(tree[l].key>tree[r].key){
		tree[r].l=merge(l,tree[r].l);
		update(r);
		return r;
	}
}
int l,r,p;
void insert(int i){
	split(root,i,l,r);
	root=merge(merge(l,add(i)),r);
}
void pop(int i){
	split(root,i,l,p);
	split(l,i-1,l,r);
	r=merge(tree[r].l,tree[r].r);
	root=merge(merge(l,r),p);
}
int findrk(int x){
	split(root,x-1,l,r);
	int k=tree[l].size+1;
	root=merge(l,r);
	return k;
}
int findval(int i,int k){
	if(tree[lc].size+1==k){
		return tree[i].val;
	}
	if(tree[lc].size>=k){
		return findval(lc,k);
	}
	else{
		return findval(rc,k-tree[lc].size-1);
	}
}
int pre(int i){
	split(root,i-1,l,r);
	int k=findval(l,tree[l].size);
	root=merge(l,r);
	return k;
}
int back(int i){
	split(root,i,l,r);
	int k=findval(r,1);
	root=merge(l,r);
	return k;
}
int last,ans;
int n,m;
int a[MAXN*4];
struct Quest{
	int l,r,k,id;
}q[MAXN*4];
bool cmp(const Quest &q1,const Quest &q2){
	if(q1.l!=q2.l){
		return q1.l<q2.l;
	}
	return q1.r<q2.r;
}
int answer[MAXN*4];
int px=1,py=0;
signed main(){
	scanf("%lld%lld",&n,&m);
	forr(i,1,n){
		scanf("%lld",&a[i]);
	}
	forr(i,1,m){
		scanf("%lld%lld%lld",&q[i].l,&q[i].r,&q[i].k);
		q[i].id=i;
	}
	sort(q+1,q+m+1,cmp);
	forr(i,1,m){
		while(py<q[i].r){
			insert(a[++py]);
		}
		while(px<q[i].l){
			pop(a[px++]);
		}
		answer[q[i].id]=findval(root,q[i].k+1);
	}
	forr(i,1,m){
		printf("%lld\n",answer[i]);
	}
}
2021/4/19 19:35
加载中...