Pagini recente » Monitorul de evaluare | Cod sursa (job #1916040) | Cod sursa (job #1044331) | jc2020/solutii/heist | Cod sursa (job #983368)
Cod sursa(job #983368)
# include <iostream>
# include <fstream>
# include <cmath>
using namespace std;
# define MAXN 100010
ifstream f("scmax.in");
ofstream g("scmax.out");
int v[MAXN], n;
int len[MAXN], maxl, maxp;
int prrev[MAXN];
int aux[MAXN];
int search(int x)
{
int a = 0, b = maxl, mdl;
while (a <= b) {
mdl = a + ((b - a) >> 1);
if (v[aux[mdl]] < x && x <= v[aux[mdl + 1]]) {
return mdl;
} else if (v[aux[mdl + 1]] < x) {
a = mdl + 1;
} else {
b = mdl - 1;
}
}
return maxl;
}
void recover(int i)
{
if (prrev[i] > 0) {
recover(prrev[i]);
}
g << v[i] << ' ';
}
int main()
{
f >> n;
for (int i = 1; i <= n; i++) {
f >> v[i];
}
maxl = 1;
aux[1] = 1;
len[1] = 1;
for (int i = 2; i <= n; ++i) {
int pos = search(v[i]);
prrev[i] = pos;
len[i] = pos + 1;
aux[pos + 1] = i;
maxl = max(maxl, pos + 1);
if (len[i] > len[maxp]) {
maxp = i;
}
}
g << maxl << endl;
/*for (int i = 1; i <= n; i++) {
cout << prrev[i] << ' ';
}*/
recover(maxp);
return 0;
}