Pagini recente » Cod sursa (job #3157787) | Cod sursa (job #2415673) | Cod sursa (job #1118187) | Cod sursa (job #1798098) | Cod sursa (job #1889633)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, best[100010], p[100010], L[100010], v[100010], poz, nr, maxim, max_poz;
///L memoreaza elementele in ordine crescatoare
void afis(int i)
{
if(p[i])afis(p[i]);
fout<<v[i]<<' ';
}
int caut(int x)
{
int st = 0, dr = nr, mi = (st+dr)/2;
while(st <= dr)
{
if(v[L[mi]] < x && v[L[mi+1]] >= x) return mi;
else if(v[L[mi+1]] < x){st = mi+1; mi = (st+dr)/2;}
else {dr = mi-1; mi = (st+dr)/2;}
}
return nr;
}
int main()
{
fin >> n;
nr = 1;
for(int i=1; i<=n; i++)
fin >> v[i];
best[1] = L[1] = 1;
for(int i=2; i<=n; i++)
{
poz = caut(v[i]);
p[i] = L[poz];
best[i] = poz + 1;
L[poz+1] = i;
if(poz+1 > nr) nr = poz+1;
}
for(int i=1; i<=n; i++)
{
if(best[i] > maxim)
{
maxim = best[i];
max_poz = i;
}
}
fout<<maxim<<'\n';
afis(max_poz);
return 0;
}