Pagini recente » Cod sursa (job #963918) | Cod sursa (job #2169749) | Cod sursa (job #712135) | Cod sursa (job #2801498) | Cod sursa (job #1916048)
#include<fstream>
using namespace std;
int a[100003];
int indice[100003];
int indice_ant[100003];
int finala[100003];
int i,n,lungime=1,pozitie,x;
int caut_binar (int i)
{
int ls,ld,mij,sol=0;
ls=1; ld=lungime;
while (ls<=ld)
{
mij=(ls+ld)/2;
if (a[i]>a[indice[mij]]) {sol=mij; ls=mij+1;}
else ld=mij-1;
}
return sol+1;
}
int main ()
{
ifstream f ("scmax.in");
ofstream g ("scmax.out");
f>>n;
indice[1]=1;
for (i=1; i<=n; i++) f>>a[i];
for (i=2; i<=n; i++){
if (a[i]>a[indice[lungime]]) //daca a[i] este mai mare decat ultimul element al subsirului curent
//atunci il adaugam la subsir
{
lungime++;
indice[lungime]=i; //punem indicele noului capat de subsir
indice_ant[i]=indice[lungime-1]; //indice anterior al noului elem este indicele fostului capat de subsir
}
else
{
//caut pe ce pozitie ar fi elem curent daca s-ar afla in subsir si nu ar conta ordinea
//adica 1 daca este cel mai mic din subsir, sau pozitia celui mai mic nr mai mai mare ca el
pozitie=caut_binar(i);
indice[pozitie]=i;
indice_ant[i]=indice[pozitie-1];
}
}
g<<lungime<<'\n';
int copie; copie=lungime;
finala[lungime]=a[indice[lungime]]; //ultimul element al subsirului
i=indice_ant[indice[lungime]];
while (i!=0){
finala[--lungime]=a[i];
i=indice_ant[i];
}
for (i=1; i<=copie; i++)
g<<finala[i]<<" ";
return 0;
}