Cod sursa(job #2027244)

Utilizator alex2704Pirvuceanu Alexandru alex2704 Data 25 septembrie 2017 20:19:10
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include<fstream>
#include<iostream>
using namespace std;
#define MAX 100001
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int a[MAX],b[MAX],poz[MAX];
int n,m;

void citire()
{
int i;
 fin>>n;
 for(i=1;i<=n;i++)
 fin>>a[i];
}

int caut(int p, int u, int x)
{
 int m;
 while(p<=u)
 {
 m=p+(u-p)/2;
 if(x<a[b[m]])
 p=m+1;
 else
 u=m-1;
 }
 return p;
}
void subsir()
{
    int i,j,k;
    a[0]=1234567890;
for(i=n;i>=1;i--)
 {
    poz[i]=0;
    k=caut(1,m,a[i]);
    if(k>m)
    {
       poz[i]=b[k-1];
       m=k;
       b[k]=i;
    }
    else
    {
       poz[i]=b[k-1];
       if(a[b[k]]<a[i])
       b[k]=i;
    }
  }
}

void tipar()
{
    int i;
    fout<<m<<'\n';
    for(i=b[m];i>0;i=poz[i])
    {
        fout<<a[i]<<' ';
    }
}
int main()
{
citire();
subsir();
tipar();
return 0;
}