Pagini recente » Cod sursa (job #1100716) | Cod sursa (job #1046357) | Cod sursa (job #1491697) | Cod sursa (job #308406) | Cod sursa (job #1516934)
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n,k;
int v[100010],maxim[100010],prec[100010];
int aux[100010],poz[100010]; // aux=vectorul in care facem cautarea binara
stack <int> rez;
int cautare_binara (int st, int dr, int x)
{
if (st==dr)
return st;
int m=(st+dr)/2;
if (x<aux[m])
return cautare_binara (st,m,x);
return cautare_binara (m+1,dr,x);
}
void creare ()
{
maxim[1]=1;
prec[1]=0;
aux[1]=v[1];
poz[1]=1;
k=1;
for (int i=2;i<=n;i++)
{
if (v[i]>aux[k])
{
prec[i]=poz[k];
maxim[i]=maxim[poz[k]]+1;
k++;
aux[k]=v[i];
poz[k]=i;
}
else
{
int x=cautare_binara(1,k,v[i]);
prec[i]=poz[x-1];
maxim[i]=maxim[poz[x]];
aux[x]=v[i];
poz[x]=i;
}
}
}
void afisare ()
{
fout<<k<<"\n";
int i=poz[k];
while (i)
{
rez.push (v[i]);
i=prec[i];
}
while (!rez.empty())
{
fout<<rez.top()<<" ";
rez.pop();
}
}
int main()
{
fin>>n;
for (int i=1;i<=n;i++)
fin>>v[i];
creare();
afisare();
return 0;
}