Cod sursa(job #797172)

Utilizator cat_red20Vasile Ioana cat_red20 Data 13 octombrie 2012 16:20:12
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<stdio.h>
int v[100001],l[100001],p[100001],q[100001],u,n,poz,max;
FILE *fin,*fout;

void citire()
{
    fin=fopen("scmax.in","r");
    fscanf(fin,"%d",&n);
    for(int i=1;i<=n;i++)
    {
        fscanf(fin,"%d",&v[i]);
    }
}

int cauta(int x)
{
    int st=1,sf=max,m;
    while(st<=sf)
    {
        m=(st+sf)/2;
        if(v[l[m]]<v[x])
        {
            st=m+1;
        }
        else
        sf=m-1;
    }
    return st;
}

void rec(int x)
{
    if(p[x]!=0)
        rec(p[x]);
    fprintf(fout,"%d ",v[x]);
}

void afisare()
{
    fout=fopen("scmax.out","w");
    fprintf(fout,"%d\n",max);
    for(int i=1;i<=n;i++)
    {
        if(q[i]==max)
        {
            rec(i);
            break;
        }
    }
}

int main()
{
    citire();
    q[1]=1;
    l[1]=1;
    max=1;
    for(int i=2;i<=n;i++)
    {
        poz=cauta(i);
        l[poz]=i;
        q[i]=poz;
        p[i]=l[poz-1];
        if(poz>max)
        max=poz;

    }
    afisare();
    return 0;
}