Pagini recente » Cod sursa (job #2077874) | Cod sursa (job #243749) | Cod sursa (job #812930) | Cod sursa (job #275736) | Cod sursa (job #2180752)
#include <vector>
#include <fstream>
#define VMAX 100010
std::ifstream fin("scmax.in");
std::ofstream fout("scmax.out");
int n;
std::vector<int> v(1);
int a[VMAX];
int pos[VMAX];
int find(int val) {
if (v[v.size() - 1] < val) {
v.push_back(0);
return v.size() - 1;
}
int m, lo = 0, hi = v.size();
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) {
for (int i = srcPos; i >= 1; i--)
if (pos[i] == val) {
solve(i - 1, val - 1);
fout << v[pos[i]] << ' ';
break;
}
}
int main() {
fin >> n;
for (int i = 1; i <= n; i++)
fin >> a[i];
pos[1] = 1;
v.push_back(a[1]);
for (int i = 2; i <= n; i++) {
int j = find(a[i]);
v[j] = a[i];
pos[i] = j;
}
fout << v.size() - 1 << '\n';
solve(n, v.size() - 1);
fout << '\n';
fout.close();
return 0;
}