Cod sursa(job #1709009)

Utilizator Spiromanii_MessiUNIBUCThrowTerror Spiromanii_Messi Data 28 mai 2016 10:33:55
Problema Pq Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.62 kb
#include <bits/stdc++.h>

using namespace std;

# define pb push_back
# define mp make_pair
# define FORN( a , b , c ) for ( int a = b ; a <= c ; ++ a )
# define FORNBACK( a , b , c ) for ( int a = b ; a >= c ; -- a )

const int Nmax = 100001;
int N,M,v[Nmax];
int L[Nmax],Nx[Nmax];
int Ans[Nmax],Y[Nmax];
int A[4*Nmax];
vector<int> Q[Nmax];
void upd(int i,int st,int dr,int w,int val){
    if(st>=dr) A[i]=val;
    else{
        int mij=(st+dr)/2;
        if(w<=mij) upd(2*i,st,mij,w,val);
        else upd(2*i+1,mij+1,dr,w,val);
        A[i]=max(A[2*i],A[2*i+1]);
    }
}
int query(int i,int st,int dr,int a,int b){
    if(a<=st && dr<=b) return A[i];
    int mij=(st+dr)/2;
    if(b<=mij) return query(2*i,st,mij,a,b);
    if(a>mij) return query(2*i+1,mij+1,dr,a,b);
    int aa=query(2*i,st,mij,a,mij);
    int bb=query(2*i+1,mij+1,dr,mij+1,b);
    return max(aa,bb);
}



int main()
{
    ios :: sync_with_stdio ( false ) ;

    freopen( "pq.in" , "r" , stdin ) ;
    freopen( "pq.out" , "w" , stdout ) ;
    cin>>N>>M;
    for(int i=1;i<=N;i++) cin>>v[i];
    int x;
    for(int i=1;i<=M;i++){
        cin>>x>>Y[i];
        Q[x].push_back(i);
    }
    for(int i=N;i>=1;i--){
        if(L[v[i]]) Nx[i]=L[v[i]];
        L[v[i]]=i;
    }
    for(int i=N;i>=1;i--){
        if(Nx[i]){
            upd(1,1,N,Nx[i],Nx[i]-i);
        }
        for(vector<int>::iterator it=Q[i].begin();it!=Q[i].end();++it){
            Ans[*it]=query(1,1,N,i,Y[*it]);
        }
    }
    for(int i=1;i<=M;i++){
        if(Ans[i]==0) cout<<"-1\n";
        else cout<<Ans[i]<<'\n';
    }

    return 0 ;
}