Pagini recente » Cod sursa (job #2107685) | Cod sursa (job #1241554) | Cod sursa (job #2388) | Cod sursa (job #805491) | Cod sursa (job #1861627)
#include <fstream>
#include <stack>
using namespace std;
ifstream F("scmax.in");
ofstream G("scmax.out");
#define INF 1999999999
int n, i, j, len, st, dr, mij, spot, s1, s2;
int a[100010], d[100010], path[100010];
stack<int> sol;
int main()
{
F >> n;
for(i = 1; i <= n; ++ i)
F >> a[i];
len = 1;
for (j = 1 ; j <= n ; j++) d[j] = INF;
for (j = 1 ; j <= n ; j++) {
st = 1; dr = len + 1;
spot = -INF;
while (st <= dr) {
mij = (st + dr) / 2;
if (d[mij] == INF || a[j] <= a[d[mij]]) {
spot = mij;
dr = mij - 1;
} else {
st = mij + 1;
}
}
d[spot] = j;
path[j] = d[spot - 1];
len = max(len, spot);
}
G << len << '\n';
j = d[len];
for (i = 1 ; i <= len ; i++) {
sol.push(a[j]);
j = path[j];
}
while (!sol.empty()) {
G << sol.top() << ' ';
sol.pop();
}
return 0;
}