Cod sursa(job #2174752)

Utilizator ioanavasilescuIoana Vasilescu ioanavasilescu Data 16 martie 2018 13:17:27
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <iostream>
#include <fstream>

#define lim 100002

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int a[lim];
int t[lim],last[lim],ind[lim];


int cauta(int x,int dr)
{
    int st=1,mij;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(last[mij]==x)return mij;
        if(last[mij]<x)st=mij+1;
        else dr=mij-1;
    }
    return dr;
}

void afish(int i)
{
    if(t[i]==0)
    {
        fout<<a[i]<<" ";
        return;
    }
    afish(t[i]);
    fout<<a[i]<<" ";
}

int main()
{
    int k=0,n;
    fin>>n;
    for(int i=1;i<=n;i++)
        fin>>a[i];
    for(int i=1;i<=n;i++)
    {
        if(a[i]>last[k])
        {
            last[++k]=a[i];
            t[i]=ind[k-1];
            ind[k]=i;
        }
        else
        {
            int dr=cauta(a[i],k);
            while(last[dr]<a[i])
                dr++;
            last[dr]=a[i];
            t[i]=ind[dr-1];
            ind[dr]=i;
        }
    }
    fout<<k<<"\n";
    afish(ind[k]);
    return 0;
}