Pagini recente » Cod sursa (job #3141169) | Cod sursa (job #351169) | Cod sursa (job #2113675) | Cod sursa (job #2564565) | Cod sursa (job #2606402)
///Bogdan-Mihai Dumitru, O(n*log n)
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n, v[101],poz[101],urm[101],lg[101],elem=1;
void citire()
{
in>>n;
for(int i=1;i<=n;i++)
in>>v[i];
lg[1]=urm[1]=1;
urm[0]=0;///indexarea se face de la 1
}
void afis(int elem)
{
if(poz[elem]>0)
afis(poz[elem]);
out<<v[elem]<<' ';
}
int cautUrmNr(int nr)
{
int st=0,dr=elem,mij=(st+dr)/2;
while(st<=dr)
{
if(v[urm[mij]] < nr && v[urm[mij+1]]>=nr)
return mij;///elementul gasit poate fi pusit temporar sau permanent in solutii;
else if(nr>v[urm[mij]])///elementul verificat este mai mic decat elementul curent, deci vom cauta in stanga pivotului
{
st=mij+1;
mij=(st+dr)/2;
}
else///elementul verificat este mai mare decat pivotul, deci cautam sa fixam in stanga pivotului
{
dr=mij-1;
mij=(st+dr)/2;
}
}
return elem;///daca se returneaza asta, inseamna ca elementul gasit nu are nicio sansa sa fie in sirul final
}
int main()
{
citire();
int aux;
for(int i=2;i<=n;i++)
{
aux=cautUrmNr(v[i]);///caut o posibila pozitie pentru elementul curent in sirul final
poz[i]=urm[aux];
lg[i]=aux+1;
urm[aux+1]=i;///vectorul aux indica pentru fiecare pozitie din vector, pozitia elementului in sirul initial care a fost ales la pasul respectiv
///asta ne mai ajuta si la compararea urmatoarelor numere cu cele puse deja in vector pentru a ne asigura ca se potrivesc
if(elem<aux+1)
elem=aux+1;///indica faptul ca pe pozitia curenta am pus cel mai bun element, asa ca vom trece la urmatoare pozitie
}
int lgSir=0;
for(int i=1;i<=n;i++)
if(lgSir<lg[i])
{
lgSir=lg[i];
aux=i;
}
out<<lgSir<<endl;
afis(aux);
}