Pagini recente » Cod sursa (job #278198) | Cod sursa (job #2916501) | Cod sursa (job #2803512) | Cod sursa (job #562523) | Cod sursa (job #1267464)
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
const int Nmax = 100005;
int n;
// initial vector | sorted vector with unique elements | normalized vector (norm[i] = pozition of v[i] in the sorted vector
int v[Nmax], vu[Nmax], norm[Nmax];
// aib tree | length of max sequence | trace path vector
int aib[Nmax], l[Nmax], t[Nmax];
#define trace(x) cerr << #x << ": " << x << '\n';
void print(int* a, int l) {
for (int i = 1; i <= l; ++i)
printf("%d ", a[i]);
printf("\n");
}
void update(int idx, int i) {
for (; idx <= n; idx += (idx & -idx))
if (l[i] > l[aib[idx]])
aib[idx] = i;
}
int query(int idx) {
int maxx = 0;
for (; idx; idx -= (idx & -idx))
if (l[maxx] < l[aib[idx]])
maxx = aib[idx];
return maxx;
}
int main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int m = 1, best = 0;
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &v[i]);
norm[i] = vu[i] = v[i];
}
sort(vu + 1, vu + n + 1);
for (int i = 2; i <= n; ++i)
if (vu[m] != vu[i])
vu[++m] = vu[i];
for (int i = 1; i <= n; ++i)
norm[i] = lower_bound(vu + 1, vu + m + 1, v[i]) - vu;
for (int i = 1; i <= n; ++i) {
t[i] = query(norm[i] - 1);
l[i] = l[t[i]] + 1;
update(norm[i], i);
if (l[i] > l[best])
best = i;
}
printf("%d\n", l[best]);
for (m = 0; best; best = t[best])
vu[++m] = v[best];
for (int i = m; i; --i)
printf("%d ", vu[i]);
return 0;
}