Pagini recente » Cod sursa (job #152761) | Cod sursa (job #1392758) | Cod sursa (job #408409) | Cod sursa (job #2517420) | Cod sursa (job #1904831)
#include <fstream>
#define NMax 100010
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n, el[NMax], dp[NMax], lastPos[NMax], answ[NMax], len;
int bin_src(int left, int right, int val)
{
int ans = -1;
while (left <= right) {
int mid = (left + right) / 2;
if (val <= dp[mid]) {
ans = mid;
right = mid - 1;
}
else
left = mid + 1;
}
return ans;
}
int main()
{
f >> n;
for (int i = 1; i <= n; i++)
f >> el[i];
for (int i = 1; i <= n; i++) {
int pos = bin_src(1, len, el[i]);
if (pos == -1) {
++len;
dp[len] = el[i];
lastPos[i] = len;
}
else {
dp[pos] = el[i];
lastPos[i] = pos;
}
}
int crt = len;
for (int i = n; i >= 1; i--) {
if (lastPos[i] == crt) {
answ[crt] = el[i];
crt--;
}
}
g << len << "\n";
for (int i = 1; i <= len; i++)
g << answ[i] << ' ';
}