Cod sursa(job #2086582)

Utilizator cameleonGeorgescu Dan cameleon Data 12 decembrie 2017 11:34:10
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include<algorithm>
using namespace std;
#define NMAX 100005

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

int a[NMAX], l[NMAX], ant[NMAX], b[NMAX];
int n, k, lmax=1, pm=1;

int cautbin(int x)
{
    int p = 1,u = k, poz = k+1, mid;
    while(p<=u)
    {
        mid=(p+u)/2;
        if(a[b[mid]]==x)
            return mid;
        if(a[b[mid]]>x)
        {
            poz=mid;
            u=mid-1;
        }
        else
            p=mid+1;
    }
    return poz;
}

void afisare(int p)
{
    if(ant[p]!=p)
        afisare(ant[p]);
    fout<<a[p]<<" ";
}

int main()
{
   int i,p;
   fin>>n;
   for( i=1; i<=n;i++)
   {
       fin>>a[i];
       l[i]=1;
       ant[i]=i;
   }
   b[1]=1; k=1;//nr de lem. din b
   for(i=2;i<=n;i++)
   {
       //caut poz pe care trebuie inserat a[i] in b a.i. b sa ramana ord. cresc.
       p=cautbin(a[i]);
       b[p]=i;
       if(p==k+1)k++;

       if(l[i]<p){
        l[i]=p;
        ant[i]=b[p-1];
       }

       if(l[i]>lmax){
            lmax = l[i];
            pm = i;
       }
   }

   fout<<lmax<<'\n';
   afisare(pm);

    return 0;
}