Pagini recente » Cod sursa (job #2322433) | Istoria paginii utilizator/lpsasu | Monitorul de evaluare | Istoria paginii utilizator/alexb | Cod sursa (job #2267029)
#include <vector>
#include <fstream>
#define VMAX 100010
std::ifstream fin("scmax.in");
std::ofstream fout("scmax.out");
int n;
int lg, v[VMAX];
int a[VMAX];
int pos[VMAX];
int find(int val) {
if (v[lg] < val) {
v[++lg] = val;
return lg;
}
int m, lo = 0, hi = lg + 1;
while (hi - lo > 1) {
m = (lo + hi) >> 1;
if (val > v[m])
lo = m;
else
hi = m;
}
return hi;
}
void solve(int srcPos, int val) {
int i;
for (i = srcPos; i >= 1; i--)
if (pos[i] == val) {
solve(i - 1, val - 1);
fout << a[i] << ' ';
break;
}
}
int main() {
int i, j;
fin >> n;
for (i = 1; i <= n; i++)
fin >> a[i];
pos[1] = 1;
v[++lg] = a[1];
for (i = 2; i <= n; i++) {
j = find(a[i]);
v[j] = a[i];
pos[i] = j;
}
fout << lg << '\n';
solve(n, lg);
fout << '\n';
fout.close();
return 0;
}