Cod sursa(job #2334042)

Utilizator PetrescuAlexandru Petrescu Petrescu Data 2 februarie 2019 10:41:23
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <iostream>
#define MAX 100001

using namespace std;

int v[MAX], T[MAX], R[MAX], ordine[MAX];
int main()
{
    int n, i, j, st, dr, mij, length = 0, gasit;

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

    fin >> n;

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

    length = 1;
    T[1] = 1;
    for(i = 2; i <= n; i++)
    {
        st = 1;
        dr = length;

        gasit = -1;
        while(st <= dr)
        {
            mij = (st + dr) / 2;

            if(v[i] < v[T[mij]])
            {
                gasit = mij;
                dr = mij - 1;
            }
            else st = mij + 1;
        }

        if(gasit == -1 && v[i] > v[T[length]])
        {
            R[i] = T[length];
            length++;
            T[length] = i;
        }
        else if(v[T[gasit - 1]] < v[i])
        {
            R[i] = T[gasit - 1];
            T[gasit] = i;
        }
    }

    fout << length << endl;
    i = T[length];

    j = 1;
    ordine[j] = v[i];
    j++;
    while(R[i] != 0)
    {
        ordine[j] = v[R[i]];
        j++;
        i = R[i];
    }

    for(j = j - 1; j >= 1; j--)fout << ordine[j] << " ";
    fin.close();
    fout.close();

    return 0;
}