Pagini recente » Cod sursa (job #914085) | Cod sursa (job #2661831) | Cod sursa (job #1915451) | Cod sursa (job #398818) | Cod sursa (job #2742278)
#include <fstream>
#include <algorithm>
#include <iostream>
using namespace std;
int n, a[100001], nr, dp[100001], l, v[100001], sol[100001], cl;
void read() {
int i;
ifstream f("scmax.in");
f >> n;
for (i = 1; i <= n; i++)
f >> a[i];
f.close();
}
int cautare_binara(int x) {
int st, dr, mij;
st = 1, dr = l;
while (st <= dr) {
mij = (st + dr) / 2;
if (v[mij] >= x)
dr = mij - 1;
else st = mij + 1;
}
v[st] = x;
return st;
}
void solve() {
int i;
for (i = 1; i <= n; i++)
if (a[i] > v[l]) {
dp[i] = l + 1;
v[++l] = a[i];
}
else
dp[i] = cautare_binara(a[i]);
cl = l;
for (i = n; i >= 1; i--)
if (dp[i] == l) {
sol[l] = a[i];
l--;
}
}
void output() {
ofstream g("scmax.out");
int i;
g << cl << '\n';
for (i = 1; i <= cl; i++)
g << sol[i] << ' ';
g.close();
}
int main() {
read();
solve();
output();
return 0;
}