Cod sursa(job #1971515)

Utilizator Alex_AeleneiAlex Aelenei Ioan Alex_Aelenei Data 20 aprilie 2017 15:14:13
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<bits/stdc++.h>
using namespace std;
int poz (long a[5002], int p, int u)
{
    int piv=a[p],aux;
    while (p<u)
    {
        if (a[p]>a[u])
        {
            aux=a[p];
            a[p]=a[u];
            a[u]=aux;
        }
        if (piv==a[p]) u--;
        else p++;
    }
    return p;
}

void quick(long a[5002], int p, int u)
{
    int k;
    if (p<u)
    {
        k=poz(a,p,u);
        quick(a,p,k-1);
        quick(a,k+1,u);
    }
}
ifstream f("secv.in");
ofstream g("secv.out");
int main()
{
    int t,max,p,n,j,i,k=0,pp[5002],nro[5002],sw,tat[5002];
    long v[5002],a[5002];
    f>>n;
    for (i=1; i<=n; i++)
        f>>v[i];
    for (i=1; i<=n; i++)
        a[i]=v[i];
    quick(a,1,n);
    k=1;
    for (i=2; i<=n; i++)
        if (a[i]!=a[i-1])
            k++;
    nro[1]=pp[1]=1;
    tat[1]=0;
    for (i=2; i<=n; i++)
    {
        t=0;
        max=0;
        for (j=i-1; j>=1; j--) if (v[i]>v[j] && max<nro[j])
        {
            max=nro[j];
            t=j;
            p=pp[j];
        }
        if (max==0)
        {
            nro[i]=1;
            tat[i]=0;
            pp[i]=i;
        }
        else
        {
            nro[i]=nro[t]+1;
            tat[i]=t;
            pp[i]=p;
        }
    }
    int min=5001;
    for (i=n; i>=k; i--)
        if (nro[i]==k && i-pp[i]+1<min)
            min=i-pp[i]+1;
    if (min<5001)
        g<<min;
    else
        g<<-1;
    return 0;
}