Cod sursa(job #2424767)

Utilizator mihhTURCU MIHNEA ALEXANDRU mihh Data 23 mai 2019 20:31:39
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>
#define N 100003
using namespace std;

int n, a[N], lg[N], poz[N], maxim, k, L[N], nr;

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

void afis(int i)
{
    if (poz[i] > 0)
        afis(poz[i]);

    fout<<a[i]<<" ";
}

int caut(int x)
{
    int 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;

        else
            u = m - 1;

        m = (p + u)/2;
    }

    return nr;
}

int main()
{
    int i, j, p;

    fin>>n;

    for (i=1; i<=n; i++)
        fin>>a[i];

    lg[1] = L[1] = 1;

    cout<<"\n------------------------- "<<2<< " \n";
    nr = 1;
    for(i=2; i<=n; ++i)
    {
        p = caut(a[i]);// cauta binar in a[] cu indicii lui L[
        poz[i] = L[p];

        lg[i] = p + 1;
        L[p + 1] = i;

        if (nr < p + 1)
            nr = p + 1;

        cout<<"p: "<<p;
        cout<<"\na[i] : "<<a[i];
        cout<<"\na[p] : "<<a[p];
        cout<<"\n------------------------- "<<i+1<< " \n";
    }

    maxim = 0;
    p = 0;

    for (i = 1; i <= n; i++)
        if (maxim < lg[i])
        {
            maxim = lg[i];
            p = i;
        }

    fout<<maxim<<"\n";

    afis(p);

    return 0;
}