Cod sursa(job #2176617)

Utilizator andrei1299Ghiorghe Andrei Alexandru andrei1299 Data 17 martie 2018 20:49:34
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <iostream>
#include <fstream>
using namespace std;
int v[100005],sol[100005],poz[100005],k,s,n;

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

int cautpoz(int st, int dr, int x)
{
    int mid;
    while(st<=dr)
    {
        mid=(st+dr)/2;
        if(v[sol[mid]]>=x && v[sol[mid-1]]<x) return mid;
        if(v[sol[mid]]<=x) st=mid+1;
        else dr=mid-1;
    }
    return k+1;
}

void scmax()
{
    int i,j,aux;
    sol[++k]=1;
    for(i=2;i<=n;i++)
    {
        aux=cautpoz(1,k,v[i]);
        if(aux==k+1)
        {
            sol[++k]=i;
            poz[i]=sol[k-1];
        }
        else
        {
            sol[aux]=i;
            poz[i]=sol[aux-1];
        }
    }
}

void rec(int x)
{
    s++;
    if(poz[x]!=0)
    rec(poz[x]);
    else fout<<s<<"\n";
    fout<<v[x]<<" ";
}


int main()
{
    int i;
    fin>>n;
    for(i=1;i<=n;i++)
    {
        fin>>v[i];
    }
    scmax();
    rec(sol[k]);
    fin.close();
    fout.close();
    return 0;
}