Pagini recente » Cod sursa (job #1587205) | Cod sursa (job #1487222) | Cod sursa (job #921942) | Cod sursa (job #2170078) | Cod sursa (job #486975)
Cod sursa(job #486975)
#include <iostream>
#include <stdlib.h>
#include <fstream>
#define NMAX 100005
using namespace std;
int v[NMAX], b[NMAX], p[NMAX], L = 1, N;
FILE *in = fopen("scmax.in", "r");
FILE *out = fopen("scmax.out", "w");
void solve()
{
int start, stop, mij;
b[1] = 1;
for (int i = 2; i <= N; i++)
{
if (v[i] > v[b[L]])
{
p[i] = b[L];
b[++L] = i;
continue;
}
start = 1, stop = L;
// gasirea max-ului prin d.e.i.
while (start < stop)
{
mij = (start + stop) / 2;
if (v[i] > v[b[mij]])
start = mij + 1;
else
stop = mij;
}
int j = start - 1; // j -> v[i] > v[b[j]]
p[i] = b[j];
if (j == L || v[i] < v[b[j + 1]])
{
b[j + 1] = i;
L = max(L, j + 1);
}
}
fprintf(out, "%d\n", L);
}
void constructSol(int i)
{
if (p[i] > 0) constructSol(p[i]);
fprintf(out, "%d ", v[i]);
}
int main()
{
fscanf(in, "%d", &N);
for (int i = 1; i <= N; i++)
fscanf(in, "%d", &v[i]);
solve();
constructSol(b[L]);
return 0;
}