Cod sursa(job #474582)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 4 august 2010 11:20:12
Problema Secv Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>
#include <algorithm>
using namespace std;
int a[5001],urm[5001],poz[5001],n,j,sir[5001],afisare,start[5001];
bool cmp(int x,int y)
{
    return(x<y);
}
int binary(int val)
{
    int i,step;
    for(step=1;step<=n;step<<=1);
    for(i=0;step;step>>=1)
    if((a[i+step]<=val)&&(i+step<=n)) i+=step;
    return i;
}
int main()
{
    int i,x;
    ifstream fi("secv.in");
    ofstream fo("secv.out");
    fi>>n;
    for(i=1;i<=n;i++) fi>>a[i];
    memcpy(sir,a,sizeof(a));
    sort(a+1,a+n+1,cmp);
    poz[1]=1;
    for(i=2;i<=n;i++)
        if(a[i]!=a[i-1]) poz[i]=poz[i-1]+1; else poz[i]=poz[i-1];
    //fiecare element din sirul sortat are un nr de ordine
    //pentru a stabili ordinea numerelor din subsir
    for(i=1;i<=n;i++)
       {
           x=binary(sir[i]);
           urm[i]=poz[x];
       }
    afisare=int(2e9);
    for(i=1;i<=n;i++)
    {
        if(urm[i]==1) start[i]=i;
        if(start[i]!=0)
        for(j=i+1;j<=n;j++)
            if((urm[j]==urm[i]+1)&&(start[i]>start[j])) start[j]=start[i];
        if(afisare>i-start[i]+1)  afisare=i-start[i]+1;
    }
    if(afisare!=0)
    fo<<afisare<<"\n"; else fo<<"-1\n";

    fo.close();
    return 0;
}