Cod sursa(job #1865722)

Utilizator cosminmaneaCosmin Manea cosminmanea Data 1 februarie 2017 23:51:12
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <cstdio>
#define ll 100010
using namespace std;


int a[ll],t[ll],last[ll],ind[ll],n,m,p,li,lf,i;
//p=kte elemente am last
int main()
{
    FILE *f=fopen("scmax.in","r");
    fscanf(f,"%d%d",&n,&a[1]);
    last[p=1]=a[1];
    ind[1]=1;t[1]=0;
    for(i=2;i<=n;i++)
    {
        fscanf(f,"%d",&a[i]);
        //cautam binar a[i] in vectorul last
        li=1;lf=p;
        m=(li+lf)/2;
        while(li<=lf)
        {
            if(a[i]<=last[m])
                lf=m-1;
            else
                li=m+1;
            m=(li+lf)/2;
        }
        if(li>p)
        {
            last[++p]=a[i];
            ind[p]=i;
            t[i]=ind[p-1];
        }
        else if(lf==0||last[lf]!=a[i])
        {
            last[li]=a[i];
            ind[li]=i;
            t[i]=ind[li-1];
        }
    }
    fclose(f);
    f=fopen("scmax.out","w");
    fprintf(f,"%d\n",p);
    i=ind[p];
    int k=p;
    while(i)
    {//refolosim vectorul ind ca shi-asha NU ne mai trebuie
        ind[k--]=a[i];
        i=t[i];
    }
    for(i=1;i<=p;i++)fprintf(f,"%d ",ind[i]);
    return 0;
}