Cod sursa(job #1516832)

Utilizator iulian_f2kGuraliuc Iulian iulian_f2k Data 3 noiembrie 2015 17:16:45
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <iostream>
#include <vector>
#include <cstdio>
#include <fstream>

using namespace std;

vector<int> v,previous,m;
int n;


//returneaza pozitia celei mai mari valori mai mica decat val
int cautare(int p, int u, int val)
{
    int mij;
    mij= p + (u-p)/2;
    if(p>u)
        return -1;

    if(val==v[m[mij]])
        return -2;
    if(v[m[mij]]<val && val<v[m[mij+1]])
        return mij;
    else if(val<v[m[mij]])
        return cautare(p,mij-1,val);
    else
        return cautare(mij+1,u,val);
}
//verifica daca m este gol sau daca valoare este mai mare decat ultimul element(cel mai mare)
int cauta(int val)
{
    if(m.empty() || v[m.back()]<val)
        return m.size()-1;

    return cautare(0,m.size()-2,val);
}

void citire()
{
    int i,x;
    cin>>n;
    for(i=0; i<n; i++)
    {
        cin>>x;
        //adauga numarul in vector
        v.push_back(x);
        //cauta pozitia celui mai mare element mai mic decat x din vectorul m
        int poz=cauta(x);
        //daca elementul nu se afla in vector
        if(poz>-2)
        {
            //inlocuieste urmatorul element din m cu pozitia i
            if(poz+1>=m.size())
                m.push_back(i);
            else
                m[poz+1]=i;

            //retinem elementul anterior din subsir
            previous.push_back(poz == -1 ? -1 : m[poz]);
        }
    }

}

void afisare(int i)
{
    if(previous[i]!=-1)
        afisare(previous[i]);
    cout<<v[i]<<' ';
}

void afisare()
{
    int i;
    i=m.back();
    vector<int> afis;
    while(previous[i]!=-1)
    {afis.push_back(v[i]);
    i=previous[i];
    }
    afis.push_back(v[i]);

    for(int i=afis.size()-1;i>=0;i--)
        cout<<afis[i]<<' ';
}

int main()
{
    freopen("scmax.in","rt",stdin);
    freopen("scmax.out","wt",stdout);
    citire();
    cout<<m.size()<<'\n';
    afisare();
    cout<<'\n';
    return 0;
}