Cod sursa(job #1798830)

Utilizator Kln1000Ciobanu Bogdan Kln1000 Data 5 noiembrie 2016 14:26:41
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <iostream>
#include <fstream>
#include <vector>

#define nmax 100010

using namespace std;

ifstream f ("scmax.in");
ofstream t ("scmax.out");

int v[100010],q[100010],sol[100010],d[100010],tata[100010],nr=0;


int bin_search(int x)
{
    int st=1,dr=nr;
    while(st<=dr)
    {
        int mid=(st+dr)/2;
        if(x<=v[q[mid]]) dr=mid-1;
        else st=mid+1;
    }
    return st;
}

int main()
{   int n;
    f>>n;
    for (int i=1;i<=n;++i)
        f>>v[i];
    for(int i=1;i<=n;++i){
        int pos=bin_search(v[i]);
        if(pos>nr) ++nr;
        q[pos]=i;
        d[i]=d[q[pos-1]]+1;
        tata[i]=q[pos-1];
    }
    int max=0,pos,nr=0;
    for(int i=1;i<=n;++i)
        if(d[i]>max) max=d[i],pos=i;
    for(int i=pos;i>0;i=tata[i])
        sol[++nr]=v[i];
    t<<nr<<'\n';
    for (int i=nr;i>0;--i)
        t<<sol[i]<<" ";
    return 0;
}