Pagini recente » Cod sursa (job #2816917) | Cod sursa (job #1276417) | Cod sursa (job #2048705) | Cod sursa (job #2571351) | Cod sursa (job #3253684)
#include <bits/stdc++.h>
#pragma GCC optimize ("O3")
#pragma GCC optimize ("fast-math")
#pragma GCC optimize ("unroll-loops")
using namespace std;
#define int long long
#define ll long long
#define all (x) begin(x), end(x)
#define xx first
#define yy second
#define cin fin
#define cout fout
ifstream cin ("scmax.in");
ofstream cout ("scmax.out");
using pii = pair <int, int>;
using tii = tuple <int, int>;
int n;
constexpr int NMAX = (int) 1e5;
int v[NMAX + 1];
int dp[NMAX + 1];
int poz[NMAX + 1];
int ans1[NMAX + 1];
int k;
inline int bn (int ans, int l, int r)
{
int idx;
while (l <= r)
{
int mid = (l + r) >> 1;
if (ans <= dp[mid])
{
idx = mid;
r = mid - 1;
}
else
l = mid + 1;
}
return idx;
}
signed main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
for (int i = 1; i <= n; ++ i)
{
cin >> v[i];
}
k = 1;
dp[1] = v[1];
poz[1] = 1;
for (int i = 2; i <= n; ++ i)
{
if (v[i] > dp[k])
{
dp[++ k] = v[i];
poz[i] = k;
}
else
{
int val = bn (v[i], 1, k);
dp[val] = v[i];
poz[i] = val;
}
}
int cp = n;
for (int i = k;i >= 1; -- i)
{
while (poz[cp] != i)
cp --;
ans1[i] = cp;
}
cout << k << '\n';
for (int i = 1; i <= k; ++ i)
{
cout << v[ans1[i]] << ' ';
}
return 0;
}