Pagini recente » Cod sursa (job #910890) | Cod sursa (job #2223546) | Cod sursa (job #2990199) | Cod sursa (job #722005) | Cod sursa (job #1516832)
#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;
}