Pagini recente » Cod sursa (job #169431) | Cod sursa (job #1153772) | Cod sursa (job #656467) | Cod sursa (job #2915844) | Cod sursa (job #1135238)
#include <fstream>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int N;
int nr, maxim, pos;
int V[100002], best[100002], p[100002], L[100002];
int bs(int x)
{
int l = -1, r = nr + 1;
while (r - l > 1)
{
int mid = (l + r) / 2;
if (V[L[mid]] < x && V[L[mid + 1]] >= x)
return mid;
else if (V[L[mid]] < x)
l = mid;
else
r = mid;
}
return nr;
}
void show(int i)
{
if (p[i] > 0)
show(p[i]);
fout << V[i] << ' ';
}
int main()
{
fin >> N;
for (int i = 1; i <= N; ++i)
fin >> V[i];
best[1] = 1;
L[0] = 0;
L[1] = 1;
nr = 1;
for (int i = 2; i <= N; ++i)
{
pos = bs(V[i]);
p[i] = L[pos];
best[i] = pos + 1;
L[pos + 1] = i;
if (nr < pos + 1)
nr = pos + 1;
}
maxim = 0;
pos = 0;
for (int i = 1; i <= N; ++i)
if (best[i] > maxim)
{
maxim = best[i];
pos = i;
}
fout << maxim << '\n';
show(pos);
fout << '\n';
fin.close();
fout.close();
return 0;
}