Pagini recente » Cod sursa (job #1954620) | Cod sursa (job #874376) | Cod sursa (job #2476002) | Cod sursa (job #2947417) | Cod sursa (job #1438852)
#include <stdio.h>
#include <vector>
#define MAXN 100005
#define MIN(a, b) (((a) < (b))?(a):(b))
using namespace std;
int n, v[MAXN], dp[MAXN], p[MAXN], sol;
vector<int> solv;
int main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int i;
scanf("%d\n", &n);
for(i = 1; i <= n; i++)
scanf("%d ", &v[i]);
for(i = 1; i <= n; i++) {
if(p[sol] < v[i]) {
p[++sol] = v[i];
dp[i] = sol;
}
else {
int l = 0, r = sol - 1, mid;
while(l < r) {
mid = (l + r) >> 1;
if(p[mid] < v[i]) l = mid + 1;
else r = mid - 1;
}
while(p[l] >= v[i]) l--;
dp[i] = l + 1;
p[l + 1] = MIN(p[l + 1], v[i]);
}
}
printf("%d\n", sol);
for(i = n; i >= 1; i--)
if(dp[i] == sol) {
--sol;
solv.push_back(v[i]);
}
while(!solv.empty()) {
printf("%d ", solv.back());
solv.pop_back();
}
printf("\n");
return 0;
}