Cod sursa(job #2720765)

Utilizator Ioana_GaborGabor Ioana Ioana_Gabor Data 11 martie 2021 11:40:05
Problema Pq Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 2.41 kb

#include <bits/stdc++.h>
#define NMAX 100000

using namespace std;

ifstream fi("pq.in");
ofstream fo("pq.out");

int n;
int sir[NMAX+5];
int urm[NMAX+5];
int ant[NMAX+5];
int aint[4*NMAX+5];
int per[NMAX+5];
int ap[NMAX+5];
int nrq;
struct query{
    int x,y,ind,sol;
} q[NMAX+5];
int sol;

bool crit(query a,query b){
    if(a.x==b.x){
        return a.y<b.y;
    }
    return a.x<b.x;
}

bool crit2(query a,query b){
    return a.ind<b.ind;
}

void create(int nod,int st,int dr){
    if(st==dr){
        aint[nod]=per[st];
        return;
    }
    int mij=(st+dr)/2;
    create(2*nod,st,mij);
    create(2*nod+1,mij+1,dr);
    aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}

void update(int nod,int st,int dr,int poz,int val){
    if(st==dr){
        per[poz]=val;
        aint[nod]=val;
        return;
    }
    int mij=(st+dr)/2;
    if(poz<=mij){
        update(2*nod,st,mij,poz,val);
    }else{
        update(2*nod+1,mij+1,dr,poz,val);
    }
    aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}

void maxim(int nod,int st,int dr,int poz){
    if(dr<=poz){
        sol=max(sol,aint[nod]);
        return;
    }
    int mij=(st+dr)/2;
    if(poz<=mij){
        maxim(2*nod,st,mij,poz);
    }else{
        maxim(2*nod,st,mij,poz);
        maxim(2*nod+1,mij+1,dr,poz);
    }
}

void init(){
    fi>>n>>nrq;
    for(int i=1;i<=n;i++){
        fi>>sir[i];
        if(ap[sir[i]]==0){
            ant[i]=-1;
        }else{
            ant[i]=ap[sir[i]];
        }
        ap[sir[i]]=i;
    }
    for(int i=0;i<=NMAX;i++){
        ap[i]=0;
    }
    for(int i=n;i>=1;i--){
        if(ap[sir[i]]==0){
            urm[i]=-1;
        }else{
            urm[i]=ap[sir[i]];
            ap[sir[i]]=i;
        }
        ap[sir[i]]=i;
    }
    for(int i=1;i<=n;i++){
        if(ant[i]==-1){
            per[i]=-1;
        }else{
            per[i]=i-ant[i];
        }
    }
    create(1,1,n);
    for(int i=1;i<=nrq;i++){
        fi>>q[i].x>>q[i].y;
        q[i].ind=i;
    }
    sort(q+1,q+nrq+1,crit);
}

void solve(){
    int st=1;
    for(int i=1;i<=nrq;i++){
        while(st<q[i].x){
            if(urm[st]!=-1){
                update(1,1,n,urm[st],-1);
            }
            update(1,1,n,st,-1);
            st++;
        }
        sol=-1;
        maxim(1,1,n,q[i].y);
        q[i].sol=sol;
    }
    sort(q+1,q+nrq+1,crit2);
    for(int i=1;i<=nrq;i++){
        fo<<q[i].sol<<'\n';
    }
}

int main(){   
    init();
    solve();
    fi.close();
    fo.close();
}