Cod sursa(job #1836724)

Utilizator Arina2003Arina Aioanei Arina2003 Data 28 decembrie 2016 16:42:15
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>

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

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

int main()
{
    f >> n;
    for(int i = 1; i <= n; ++ i)
        f >> v[i];
    pos[1].val = v[1], pos[1].idx = 1;
    ipoz = 1;//pozitia actuala
    for(int 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;
        else// daca este mai mic se actualizeaza noul index
            pos[act_pos].val = v[i], pos[act_pos].idx = i;
    }
    g << ipoz << '\n';
    for(int i =1 ; i <= ipoz; ++i)
        g << pos[i].val << " ";
    return 0;
}