Pagini recente » Cod sursa (job #756258) | Cod sursa (job #1350887) | Cod sursa (job #2956349) | Cod sursa (job #2387739) | Cod sursa (job #2608040)
#include <iostream>
#include <fstream>
#define NMAX 100001
typedef unsigned int uint;
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
uint n;
int v[NMAX];
uint secv[NMAX], pred[NMAX];
void read() {
fin >> n;
for (uint i = 1;i <= n;++i)
fin >> v[i];
}
void push(int pos,uint &size) {
uint low = 1, high = size;
int x = v[pos];
if (x > v[secv[size]] || size == 0) {
secv[++size] = pos;
pred[pos] = secv[size - 1];
return;
}
while (low <= high) {
uint mid = low + (high - low) / 2;
if (v[secv[mid]] >= x && (mid == 1 || v[secv[mid - 1]] < x)) {
secv[mid] = pos;
pred[pos] = secv[mid - 1];
return;
}
if (v[secv[mid]] <= x)
low = mid + 1;
else
high = mid - 1;
}
}
void solve() {
uint k = 0;
for (uint i = 1;i <= n;++i) {
push(i,k);
}
fout << k << '\n';
uint i = secv[k];
int sol[NMAX];
uint e = 0;
while (i > 0) {
sol[++e] = v[i];
i = pred[i];
}
for (uint i = 1;i <= e;++i)
fout << sol[i] << ' ';
}
int main()
{
read();
solve();
return 0;
}