Pagini recente » Cod sursa (job #2649927) | Cod sursa (job #3179943) | Cod sursa (job #1959024) | Cod sursa (job #2827575) | Cod sursa (job #2486065)
#include <fstream>
#include <iostream>
#define N 100010
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, maxi, v[N], poz[N], l[N], sol[N];
int cautare(int val)
{
int st=1, dr=maxi;
while(st <= dr)
{
int mij = (st + dr) / 2;
if(v[poz[mij]] < val)
st = mij + 1;
else
dr = mij - 1;
}
return st;
}
int main()
{
fin >> n;
for(int i=1; i<=n; i++)
{
fin >> v[i];
}
l[1] = poz[1] = maxi = 1;
for(int i=2; i<=n; i++)
{
if(v[i] > v[poz[maxi]])
{
poz[++maxi] = i;
l[i] = maxi;
}
else
{
int p = cautare(v[i]);
l[i] = p;
poz[p] = i;
}
}
fout << maxi << '\n';
int maxi1 = maxi;
for(int i=n; i>=1; i--)
{
if(l[i] == maxi)
sol[maxi] = v[i], maxi--;
}
for(int i=1; i<=maxi1; i++)
{
fout << sol[i] <<" ";
}
fout << '\n';
return 0;
}