Cod sursa(job #2210389)

Utilizator andrei1299Ghiorghe Andrei Alexandru andrei1299 Data 6 iunie 2018 15:55:06
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>

using namespace std;
int N,a[100005],sol[100005],viz[100005],top;
ofstream fout("scmax.out");
void Citire()
{
    int i;
    ifstream fin("scmax.in");
    fin>>N;
    for(i=1;i<=N;i++)
        fin>>a[i];
    fin.close();
}

void AfisA();

int CautBin(int x)
{
    int st=1;
    int dr=top;
    int mid;
    while(st<=dr)
    {
        mid=(st+dr)/2;
        if(a[sol[mid]]>=x && a[sol[mid-1]]<x)
            break;
        else
        {
            if(a[sol[mid]]>=x) dr=mid-1;
            else
            {
                st=mid+1;
            }
        }
    }
    //cout<<a[mid+1]<<"\n";
    return mid;
}

void Solutie()
{
    int i,aux;
    sol[++top]=1;
    for(i=2;i<=N;i++)
    {
        if(a[i]>a[sol[top]])
        {
            viz[i]=sol[top];
            sol[++top]=i;
        }
        else
        {

            aux=CautBin(a[i]);
            /*cout<<aux<<"\n";
            AfisA();*/
            viz[i]=sol[aux-1];
            sol[aux]=i;
        }
        //AfisA();
    }
}

void Recv(int x)
{
    if(viz[x]!=0) Recv(viz[x]);
    fout<<a[x]<<" ";
}

void Afisare()
{
    fout<<top<<"\n";
    Recv(sol[top]);
}

void AfisA()
{
    for(int i=1;i<=N;i++)
        cout<<viz[i]<<" ";
    cout<<"\n";
    for(int i=1;i<=N;i++)
        cout<<sol[i]<<" ";
    cout<<"\n";
}

int main()
{
    Citire();
    Solutie();
    Afisare();
    //AfisA();
    fout.close();
}