Cod sursa(job #1757219)

Utilizator andrei1299Ghiorghe Andrei Alexandru andrei1299 Data 14 septembrie 2016 18:28:40
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;
int ant[100005],val[100005],n,poss,t,a[100005];
ofstream fout("scmax.out");
void Citire()
{
    ifstream fin("scmax.in");
    fin>>n;
    for(int i=1;i<=n;i++)
        fin>>a[i];
    fin.close();
}

void Solutie()
{
    int i,st,dr,mij;
    val[1]=1;
    t=1;
    poss=1;
    for(i=2;i<=n;i++)
    {
        if(a[i]>a[val[t]])
        {
            val[++t]=i;
            ant[i]=val[t-1];
            poss++;
        }
        else
        {
            st=1;
            dr=t;
            while(st<=dr)
            {
                mij=(st+dr)/2;
                if(a[i]>a[val[mij-1]] && a[i]<=a[val[mij]])
                {
                    val[mij]=i;
                    ant[i]=val[mij-1];
                    break;
                }
                else if(a[i]>a[val[mij]])
                        st=mij+1;
                else dr=mij-1;
            }
        }
    }

}

void rec(int k)
{
    if(ant[k]!=0) rec(ant[k]);
    fout<<a[k]<<" ";
}

void Afisare()
{
    fout<<poss<<"\n";
    rec(val[t]);
}

int main()
{
    Citire();
    Solutie();
    Afisare();
    fout.close();
    return 0;
}