Cod sursa(job #1523681)

Utilizator DoraBenzoVelicu Teodora DoraBenzo Data 12 noiembrie 2015 22:53:15
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#define ncmax 100005

using namespace std;

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

int n, a[ncmax], lght[ncmax], p[ncmax], mx, k, L[ncmax], nr, poz;

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

void afis(int i)
{
   if (p[i] > 0)  afis(p[i]);
   fout<<a[i]<<" ";
}

int caut(int x)
{
   int p, u, m;
   p = 0;
   u = nr;
   m = (p + u) / 2;
   while (p <= u)
   {
      if (a[L[m]] < x &&  a[L[m+1]] >= x)
        return m;
      else
        if (a[L[m+1]] < x)
        {
            p = m + 1;
            m = (p + u) / 2;
        }
        else
        {
            u = m - 1;
            m = (p + u)/2;
        }
   }
   return nr;
}

int main()
{
    citire();
    nr = 1;
    lght[1] = 1;
    L[1] = 1;

    for (int i = 2; i <= n; i++)
    {
        poz = caut(a[i]);
        p[i] = L[poz];
        lght[i] = poz + 1;
        L[poz + 1] = i;
        if (nr < poz + 1)
            nr = poz + 1;
    }

    poz = 0;
    for (int i = 1; i <= n; i++)
       if (mx < lght[i])
       {
          mx = lght[i];
          poz = i;
       }
    fout<<mx<<"\n";
    afis(poz);
    for(int i=1; i<=n; i++)
        cout<<L[i]<<" ";
    return 0;
}