Pagini recente » Cod sursa (job #2392392) | Monitorul de evaluare | Profil M@2Te4i | Cod sursa (job #1787564) | Cod sursa (job #2742276)
#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, answer;
st = 1, dr = l;
while (st <= dr) {
mij = (st + dr) / 2;
if (v[mij] >= x) {
dr = mij - 1;
answer = mij;
}
else st = mij + 1;
}
v[answer] = x;
return answer;
}
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;
}