Cod sursa(job #1847415)

Utilizator TibiraducanuTiberiu Raducanu Tibiraducanu Data 14 ianuarie 2017 16:52:48
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <bits/stdc++.h>

using namespace std;

const int N=5005;
struct Vect{
    int poz,val,in;
} v[N];
bool cmp(const Vect &a, const Vect &b){
    if(a.val==b.val) return a.poz<b.poz;
    return a.val<b.val;
}

int main()
{
    freopen("secv.in","r",stdin);
    freopen("secv.out","w",stdout);

    int i,n,In,Sf,Mij,prev,x;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&v[i].val);
        v[i].poz=i;
    }
    sort(&v[1],&v[n+1],cmp);

    v[0].val=-1;
    for(i=1;i<=n;i++){
        if(v[i].val!=v[i-1].val) prev=v[i-1].val;
        if(v[i].val==v[1].val){
            v[i].in=v[i].poz;
            continue;
        }

        In=1, Sf=i-1;
        //printf("(%d %d) ",In,Sf);
        while(In<Sf){
            Mij=(In+Sf)/2+1;
            if(v[Mij].val>prev) Sf=Mij-1;
            if(v[Mij].val<prev) In=Mij+1;
            if(v[Mij].val==prev){
                if(v[Mij].poz>v[i].poz) Sf=Mij-1;
                else{
                    if(v[Mij].in==0) In=Mij+1;
                    else In=Mij;
                }
            }
            //printf("(%d %d) ",In,Sf);
        }
        //printf("\n");

        if(v[In].in!=0 and v[In].val==prev and v[In].poz<v[i].poz) v[i].in=v[In].in;
    }

    //for(i=1;i<=n;i++) printf("%d %d %d\n",v[i].val,v[i].poz,v[i].in);

    int Min=(1<<20);
    for(i=n;i>=1;i--){
        if(v[i].val!=v[n].val) break;
        if(v[i].in!=0){
            x=v[i].poz-v[i].in+1;
            if(x<Min) Min=x;
        }
    }

    if(Min==(1<<20)) printf("-1\n");
    else printf("%d\n",Min);

    return 0;
}