Cod sursa(job #1800090)

Utilizator razvan99hHorhat Razvan razvan99h Data 7 noiembrie 2016 12:37:12
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, v[100005], i, j, last, tata[100005], ind[100005];

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

int main()
{
    //l[i]=lungimea maxima a unui subsir crescator care se termina pe pozitia i
    //l[i]=max(l[j]+1,l[i]), pentru fiecare 0<j<i si v[j]>v[i] - solutia de 70 de pct
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>v[i];
    ind[1]=1;
    last=1;
    for(i=2;i<=n;i++)
    {
        if(v[i]>v[ind[last]])
        {
            tata[last+1]=ind[last];
            last++;
            ind[last]=i;
        }
        else ind[caut(v[i],1,last)]=i;
    }
    tata[last+1]=ind[last];
    /*for(i=2;i<=last+1;i++)
        cout<<tata[i]<<' ';
    cout<<endl;*/
    fout<<last<<'\n';
    for(i=2;i<=last+1;i++)
        fout<<v[tata[i]]<<' ';
    return 0;
}