BZOJ 3585&&3339 靜態區間mex【主席樹】
阿新 • • 發佈:2018-12-17
直接上一發主席樹就好了吖:
#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; }