Cod sursa(job #474580)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 4 august 2010 11:08:38
Problema Secv Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>

using namespace std;
int a[5001],urm[5001],poz[5001],n,j,sir[5001],afisare,maxim,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];
       }
    maxim=0;
    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((maxim<start[i])&&(urm[i]==poz[n])) { maxim=start[i]; afisare=i-start[i]+1; }
    }
    if(afisare!=0)
    fo<<afisare<<"\n"; else fo<<"-1\n";

    fo.close();
    return 0;
}