Cod sursa(job #2485844)

Utilizator elenaisaiaElena Isaia elenaisaia Data 2 noiembrie 2019 10:00:06
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <fstream>
#include <stack>

using namespace std;

int n,a[100003],x[100003],y[100003],m=1,lgmax,pozmax;
stack<int>s;

void citire()
{
    ifstream fin("scmax.in");
    fin>>n;
    for(int i=0;i<n;i++)
        fin>>a[i];
}

int cautbin(int st,int dr,int nr)
{
    if(st==dr)
        return st;
    int mij=(st+dr)/2;
    if(nr==x[mij])
        return mij;
    if(nr>x[mij])
        return cautbin(mij+1,dr,nr);
    return cautbin(st,mij,nr);
}

void rezolvare()
{
    x[0]=a[0];
    for(int i=1;i<n;i++)
    {
        int poz;
        if(a[i]>x[m-1])
        {
            poz=m;
            m++;
        }
        else
            poz=cautbin(0,m-1,a[i]);
        x[poz]=a[i];
        y[i]=poz;
        if(poz>lgmax)
        {
            lgmax=poz;
            pozmax=i;
        }
    }
}

void afisare()
{
    ofstream fout("scmax.out");
    fout<<lgmax+1<<"\n";
    for(int i=pozmax;i>=0,lgmax>=0;i--)
        if(y[i]==lgmax)
        {
            lgmax--;
            s.push(a[i]);
        }
    while(!s.empty())
    {
        fout<<s.top()<<" ";
        s.pop();
    }
}

int main()
{
    citire();
    rezolvare();
    afisare();
    return 0;
}