Pagini recente » Cod sursa (job #1780172) | Cod sursa (job #1220139) | Cod sursa (job #3282846) | Cod sursa (job #2583714) | Cod sursa (job #3183784)
#include <fstream>
#include <iostream>
#define N 100002
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int v[N];
int poz[N];
int q[N];
void afisare(int n, int l)
{
int i;
for (i = n; i >= 1; i--)
{
if (poz[i] == l) break;
}
if (l > 1) afisare(i - 1, l - 1);
out << v[i] << ' ';
}
int main()
{
int n; in >> n;
for (int i = 1; i <= n; i++)
in >> v[i];
int l = 1;
q[1] = v[1]; poz[1] = 1;
for (int i = 2; i <= n; i++) {
// q[1]<= q[st] | q[dr].......q[l]
// < v[i] >=v[i]
if (v[i] > q[l])
{
l++;
q[l] = v[i];
poz[i] = l;
}
else
{ // v[i] < q[l]
int st = 0, dr = l;
while (st < dr - 1)
{
int m = (st + dr) / 2;
if (v[i] <= q[m])
dr = m;
else
st = m;
}
q[dr] = v[i];
poz[i] = dr;
}
}
out << l << endl;
afisare(n, l);
return 0;
}