Pagini recente » Cod sursa (job #10511) | Cod sursa (job #1137789) | Cod sursa (job #2399212) | Cod sursa (job #3004461) | Cod sursa (job #3031662)
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int n, a[100005], best[100005], lp[100005], p[100005], Max;
int cauta(int x) {
int ans = 0;
int l = 1, r = Max;
while (l <= r) {
int m = (l + r) / 2;
if (a[lp[m]] < x) {
ans = max(ans, m);
l = m + 1;
} else r = m - 1;
}
return ans;
}
void afisare(int pos) {
if (p[pos] != -1 && a[p[pos]] != 0) afisare(p[pos]);
out<<a[pos]<<" ";
}
int main() {
in>>n;
for (int i = 1; i <= n; i++)
in>>a[i];
best[1] = 1;
lp[1] = 1;
p[1] = -1;
p[0] = -1;
Max = 1;
for (int i = 2; i <= n; i++) {
int pos = cauta(a[i]);
//cout<<pos<<'\n';
best[i] = pos + 1;
p[i] = lp[pos];
lp[pos + 1] = i;
if (pos + 1 > Max) Max = pos + 1;
}
int scmax = 0;
int pmax = 0;
for (int i = 1; i <= n; i++)
if (best[i] > scmax) {
scmax = best[i];
pmax = i;
}
out<<scmax<<'\n';
afisare(pmax);
}