Pagini recente » Cod sursa (job #946734) | Cod sursa (job #656348) | Cod sursa (job #2303974) | Cod sursa (job #205423) | Cod sursa (job #2530034)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int a[100005],n,last;
int aux[100005];
int prev[100005];
int cautare(int st, int dr, int val)
{
if(st>dr)
return 0;
int m=(st+dr)/2;
if(a[aux[m]] < val)
return max(m,cautare(m+1,dr, val));
else return cautare( st, m-1, val );
}
void afis(int poz)
{
if(prev[poz]!=0) afis(prev[poz]);
fout<<a[poz]<<" ";
}
int main()
{
fin>>n;
int x;
for(int i=1; i<=n; ++i)
fin>>a[i];
for(int i=1; i<=n; ++i)
if(a[i]>a[aux[last]])
{
aux[++last]=i;
prev[i]=aux[last-1];
}
else
{
x=cautare(1,last,a[i]);
aux[x+1]=i;
prev[i]=aux[x];
}
fout<<last<<"\n";
afis(aux[last]);
//fout<<a[last];
return 0;
}