Cod sursa(job #1862991)

Utilizator cyg_ieeuVasile Radu-Andrei cyg_ieeu Data 30 ianuarie 2017 16:10:06
Problema Secv Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>

using namespace std;
int val[5005],poz[5005];
int v1[5005],v2[5005];
int bs(int val,int n)
{
    int med,dr,st;
    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 2147483647;
}
int main()
{
    freopen("secv.in", "r",stdin);
    freopen("secv.out", "w",stdout);
    int n,i,nn;
    scanf("%d", &n);
    for(i = 1;i <= n;i++)
        scanf("%d", &val[i]);
    memcpy(v1,val,sizeof(val));
    sort(v1 + 1,v1 + n + 1);
    nn = 1;
    v2[1] = v1[1];
    for(i = 2;i <= n;i++)
    {
        if(v1[i] != v1[i - 1])
        {
            nn++;
            v2[nn] = v1[i];
        }
    }
    for(i = 1;i <= n;i++)
        poz[i] = bs(val[i],nn);
    int mini = 2147483647,j,k = 0,ok;
    for(i = 1;i <= n;i++)
    {
        if(poz[i] == 1)
        {
            k = 2;j = i + 1;
            while(k <= nn)
            {
                ok = 0;
                for(;j <= n;j++)
                {
                    if(poz[j] == k)
                    {
                        ok = 1;
                        break;
                    }
                }
                if(ok == 1)
                    k++;
                else break;
            }
            if(k > nn)
                if(j - i + 1 < mini)
                    mini = j - i + 1;
        }
    }
    if(mini != 2147483647)
        printf("%d",mini);
    else
        printf("-1");
    return 0;
}