1. 程式人生 > >BZOJ 3585&&3339 靜態區間mex【主席樹】

BZOJ 3585&&3339 靜態區間mex【主席樹】

直接上一發主席樹就好了吖:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define db double
#define sg string
#define make make_pair
#define pint pair<int,int>
#define rel(i,x,y) for(int i=(x);i<(y);i++)
#define rep(i,x,y) for(int i=(x);i<=(y);i++)
#define red(i,x,y) for(int i=(x);i>=(y);i--)
#define res(i,x) for(int i=head[x];i;i=nxt[i])
using namespace std;

const int N=2e5+6;
const int Inf=1e9;
const db Eps=1e-10;

int n,m,tot=1,a[N],mex[N<<5],rt[N<<5],lson[N<<5],rson[N<<5];

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

void ins(int &x,int y,int l,int r,int a,int b) {
	x=++tot;mex[x]=mex[y];lson[x]=lson[y];rson[x]=rson[y];
	
	if(l==r) {
		mex[x]=b;return ;
	}
	
	int mid=l+r>>1;
	
	if(a<=mid) ins(lson[x],lson[y],l,mid,a,b);
	else ins(rson[x],rson[y],mid+1,r,a,b);
	
	mex[x]=min(mex[lson[x]],mex[rson[x]]);
}

int getans(int x,int l,int r,int a) {
	if(l==r) return l;
	
	int mid=l+r>>1;
	
	if(mex[lson[x]]>=a) return getans(rson[x],mid+1,r,a);
	else return getans(lson[x],l,mid,a);
}

int main() {
	n=read();
	
	rep(i,1,n) {
		a[i]=read();
		ins(rt[i],rt[i-1],0,Inf,a[i],i);
	}
	
	m=read();
	
	rep(i,1,m) {
		int x=read(),y=read();
		printf("%d\n",getans(rt[y],0,Inf,x));
	}

	return 0;
}