Pagini recente » Monitorul de evaluare | Cod sursa (job #3304946) | Cod sursa (job #1579660) | Cod sursa (job #3238215) | Cod sursa (job #3304947)
#include <bits/stdc++.h>
#define NMAX 100000
#define ll long long
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int n, lmax;
int a[NMAX + 2], sir[NMAX + 2], poz[NMAX + 2], sol[NMAX + 2];
int main() {
ios_base::sync_with_stdio(false);
fin.tie(NULL);
fout.tie(NULL);
fin >> n;
for (int i = 1; i <= n; i++) {
fin >> a[i];
}
lmax = 1;
sir[1] = a[1];
poz[1] = 1;
for (int i = 2; i <= n; i++) {
if (a[i] > sir[lmax]) {
sir[++lmax] = a[i];
poz[i] = lmax;
}
else {
int st = 1, dr = lmax, p = 0;
while (st <= dr) {
int mij = (st + dr) >> 1;
if (sir[mij] >= a[i]) {
p = mij;
dr = mij - 1;
}
else {
st = mij + 1;
}
}
sir[p] = a[i];
poz[i] = p;
}
}
fout << lmax << '\n';
for (int j = n, i = lmax; i; j--) {
if (poz[j] == i) {
sol[i] = a[j];
i--;
}
}
for (int i = 1; i <= lmax; i++) {
fout << sol[i] << ' ';
}
return 0;
}