Pagini recente » Cod sursa (job #553298) | Cod sursa (job #448665) | Cod sursa (job #1590126) | Cod sursa (job #1191415) | Cod sursa (job #1479177)
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAX_N 100000
int v[MAX_N + 1]; // vectorul dat
int cop[MAX_N + 1]; // copie a vectorul dat, folosit in reconstituire
int next[MAX_N + 1]; // vector folosit in normalizare si in reconstituirea solutiei
int d[MAX_N + 1]; // d[i] = lungimea celui mai lung subsir crescator care se termina in v[i]
int fen[MAX_N + 1]; // aib care retine dmax pe [1, i]
void normalize(int n) {
int len = 1;
for (int i = 1; i <= n; i++) {
next[i] = v[i];
}
std::sort(next + 1, next + n + 1);
for (int i = 2; i <= n; i++) {
if (next[len] != next[i]) {
next[++len] = next[i];
}
}
for (int i = 1; i <= n; i++) {
v[i] = std::lower_bound(next + 1, next + len + 1, v[i]) - next;
}
}
inline int fenQuery(int pos) {
int maxD = fen[pos];
for (; pos > 0; pos -= (pos & -pos)) {
if (d[fen[pos]] > d[maxD]) {
maxD = fen[pos];
}
}
return maxD;
}
inline void fenUpdate(int pos, int ind, int n) {
for (; pos <= n; pos += (pos & -pos)) {
if (d[fen[pos]] < d[ind]) {
fen[pos] = ind;
}
}
}
void printSol(int p, FILE *f) {
if (p > 0) {
printSol(next[p], f);
fprintf(f, "%d ", cop[p]);
}
}
int main(void) {
int n, ans;
FILE *f = fopen("scmax.in", "r");
fscanf(f, "%d", &n);
for (int i = 1; i <= n; i++) {
fscanf(f, "%d", &v[i]);
cop[i] = v[i];
}
fclose(f);
normalize(n);
for (int i = 1; i <= n; i++) {
next[i] = fenQuery(v[i] - 1);
d[i] = d[next[i]] + 1;
fenUpdate(v[i], i, n);
}
ans = 1;
for (int i = 2; i <= n; i++) {
if (d[i] > d[ans]) {
ans = i;
}
}
f = fopen("scmax.out", "w");
fprintf(f, "%d\n", d[ans]);
printSol(ans, f);
fclose(f);
return 0;
}