Pagini recente » Cod sursa (job #1064245) | Cod sursa (job #1280727) | Cod sursa (job #262515) | Cod sursa (job #1506086) | Cod sursa (job #1909338)
#include <bits/stdc++.h>
using namespace std;
const int nMax = 1e5 + 3;
int n;
int dp[nMax], from[nMax];
pair<int, int>a[nMax]; // valoarea din sir, valoarea normalizata
int last[nMax];
const int INF = 1e8;
void citire() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d", &a[i].first);
}
void Normalizare() {
vector<int>aux;
for (int i = 1; i <= n; ++i)
aux.push_back(a[i].first);
sort(aux.begin(), aux.end());
aux.resize(unique(aux.begin(), aux.end()) - aux.begin());
for (int i = 1; i <= n; ++i)
a[i].second = lower_bound(aux.begin(), aux.end(), a[i].first) - aux.begin() + 1;//id de la 1
}
void Print(int pos) {
if (!pos)
return;
Print(from[pos]);
printf("%d ", a[pos].first);
}
int main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
citire();
Normalizare();
for (int i = 1; i <= n; ++i)
dp[i] = INF;
int longest = 0, pos = 0;
for (int i = 1; i <= n; i++) {
int ans = 0;
for (int p = 17; p >= 0; --p)
if (ans + (1 << p) <= n && dp[ans + (1 << p)] < a[i].second)
ans += 1 << p;
if (ans + 1 > longest) {
longest = ans + 1;
pos = i;
}
if (a[i].second < dp[ans + 1]) {
dp[ans + 1] = a[i].second;
}
from[i] = last[dp[ans]];
last[a[i].second] = i;
}
printf("%d\n", longest);
Print(pos);
return 0;
}