Cod sursa(job #1836735)

Utilizator Arina2003Arina Aioanei Arina2003 Data 28 decembrie 2016 16:52:22
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>

using namespace std;
#define nmax 100005
ifstream f("scmax.in");
ofstream g("scmax.out");

int ipoz, n, v[nmax], sir[nmax], index[nmax], indx_st, indx_dr,act_pos, j, mijloc, imax;
struct insf{int val,idx;}pos[nmax];

int main()
{
    int i;
    f >> n;
    for( i= 1; i <= n; ++ i)
        f >> v[i];
    pos[1].val = v[1], pos[1].idx = 1;
    ipoz = 1;
    for(i = 2; i <= n; ++ i)
    {
        act_pos = -1;//flag pentru actualizarea indexului unei variri care se repeta
        indx_st = 1; indx_dr = ipoz;// indexul stanga dreapta din sirul gasit la un moment dat
        while (indx_st <= indx_dr)
        {
            mijloc = (indx_st + indx_dr) / 2;
            if(pos[mijloc].val >= v[i])// verificam daca noua val citita est mai mica sa egala decat cele din subsir
                act_pos = mijloc, indx_dr = mijloc - 1;// daca da mergem la elemtul anterior
            else
                indx_st = mijloc + 1;// daca nu este mai mica se muta limit din stanga spre dreapta
        }
        if(act_pos == -1)//daca elementul citit este mai mare se adauga in lista
            pos[++ ipoz].val = v[i], pos[ipoz].idx = i,index[i] = pos[ipoz - 1].idx;
        else// daca este mai mic se actualizeaza noul index
            pos[act_pos].val = v[i], pos[act_pos].idx = i,index[i] = pos[act_pos - 1].idx;
    }
    imax = ipoz;
    g << imax << '\n';
    ipoz = pos[ipoz].idx;
    while(ipoz)
        sir[++ j] = v[ipoz], ipoz = index[ipoz];
    for(i = imax; i > 0; -- i)
        g << sir[i] << " ";
    return 0;
}