Cod sursa(job #1863021)

Utilizator rebecca0312Andrei Rebecca rebecca0312 Data 30 ianuarie 2017 16:29:14
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include<cstdio>
#include<algorithm>
using namespace std;
const int NMAX=5005;
int v[NMAX],v1[NMAX],v2[NMAX];
int bs(int val, int n){
    int med,st=1,dr=n;
    while(st<=dr){
        med=(st+dr)/2;
        if(v2[med]==val)
            return med;
        else
            if(v2[med]<val)
                st=med+1;
            else
                dr=med-1;
    }
    return 0;
}
int main(){
    freopen("secv.in","r",stdin);
    freopen("secv.out","w",stdout);
    int n,i,dif=0,poz,last,minn=NMAX,lg=0,val,j;
    scanf("%d", &n);
    for(i=1;i<=n;i++)
        scanf("%d", &v[i]);
    if(n!=1){
        for(i=1;i<=n;i++)
            v1[i]=v[i];
        sort(v1+1, v1+1+n);
        dif=1;
        v2[dif]=v1[dif];
        last=v1[dif];
        for(i=2;i<=n;i++){
            if(v1[i]!=last){
                v2[++dif]=v1[i];
                last=v1[i];
            }
        }
        for(i=1;i<=n;i++){
            poz=bs(v[i], dif);
            v[i]=poz;
        }
        for(i=1;i<=n;i++){
            if(v[i]==1){
                val=2;
                for(j=i;j<=n;j++){
                    if(v[j]==val){
                        val++;
                        if(val==dif+1){
                            lg=j-i+1;
                            if(lg<minn)
                                minn=lg;
                            break;
                        }
                    }
                }
            }
        }
        if(minn==NMAX)
            minn=-1;
    }
    else
        minn=1;
    printf("%d", minn);
    return 0;
}