洛谷 P4137 Rmq Problem / mex(主席树)

洛谷 P4137 Rmq Problem / mex(主席树)

洛谷 P4137 Rmq Problem / mex(主席树)

const int N=3e5+5;
 
    int n,m,_;
    int i,j,k;
    int a[N];
    struct Node
    {
        int l,r;
        int sz;
        int minn;
        void update(int x){ sz++; minn=x; }
    }t[N<<5];
    int root[N],tot=0;

void push_up(int id)
{
    t[id].minn=min(t[t[id].l].minn,t[t[id].r].minn);
}

void update(int &x,int y,int val,int pos,int l,int r)
{
    x=++tot;
    t[x]=t[y];
    t[x].update(pos);
    if(l==r) return ;
    else{
        int mid=l+r>>1;
        if(mid>=val) update(t[x].l,t[y].l,val,pos,l,mid);
        else update(t[x].r,t[y].r,val,pos,mid+1,r);
        push_up(x);
    }
}

int query(int id,int l,int r,int pos)
{
    if(l==r) return l;
    else{
        int mid=l+r>>1;
        if(t[t[id].l].minn<pos) return query(t[id].l,l,mid,pos);
        else return query(t[id].r,mid+1,r,pos); 
    }
}

int main()
{
    //IOS;
    while(~sdd(n,m)){
        forn(i,1,n){
            sd(a[i]);
            update(root[i],root[i-1],a[i],i,0,n);
        }
        while(m--){
            int l,r;
            sdd(l,r);
            int ans=query(root[r],0,n,l);
            pd(ans);
        }
    }
    //PAUSE;
    return 0;
}

 

上一篇:Making the Grade(POJ-3666)


下一篇:求最小公倍数和最大公约数