Pagini recente » Cod sursa (job #1997038) | Cod sursa (job #3141164) | Cod sursa (job #2910279) | Cod sursa (job #176999) | Cod sursa (job #1836433)
#include <fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
const int MAX_N = 100001;
int N, a[MAX_N], indice[MAX_N], indice_anterior[MAX_N], solutie[MAX_N], lungime;
void citire()
{
f>>N;
for(int i=1; i<=N; i++)
f>>a[i];
}
int bs(int i)
{
int st=1, dr=lungime, solutie=0;
while(st<=dr)
{
int mijloc=(st+dr)/2;
if(a[i]>a[indice[mijloc]])
{
solutie=mijloc;
st=mijloc+1;
}
else
dr=mijloc-1;
}
return solutie+1;
}
void construieste_dinamica()
{
indice[1]=1;
lungime=1;
for(int i=2; i<=N; i++)
{
if(a[i]>a[indice[lungime]])
{
lungime++;
indice[lungime]=i;
indice_anterior[i]=indice[lungime-1];
}
else
{
int pozitie=bs(i);
indice[pozitie]=i;
indice_anterior[i]=indice[pozitie-1];
}
}
}
void obtine_solutia()
{
int pozitie = lungime, i = indice[lungime];
while(i > 0)
{
solutie[pozitie] = a[i];
i = indice_anterior[i];
pozitie --;
}
}
void afisare()
{
g<<lungime<<'\n';
for(int i=1; i<=lungime; i++)
g<<solutie[i]<<' ';
}
int main()
{
citire();
construieste_dinamica();
obtine_solutia();
afisare();
return 0;
}