Pagini recente » Cod sursa (job #2077983) | Cod sursa (job #2940852) | Cod sursa (job #1138489) | Cod sursa (job #1812898) | Cod sursa (job #2241172)
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int NMAX = 1e5+5;
int n,v[NMAX],res[NMAX],lst[NMAX],dp[NMAX],fn[NMAX],up[NMAX];
int query(int x)
{
int Max = 0;
while (x>0)
{
if (dp[fn[x]]>dp[Max])
Max = fn[x];
x-=x&-x;
}
return Max;
}
void update(int k, int x)
{
while (x<=n)
{
if (dp[k]>dp[fn[x]])
fn[x] = k;
x+=x&-x;
}
}
int main()
{
in >> n;
for (int i = 1; i<=n; i++)
{
in >> v[i];
res[i] = lst[i] = v[i];
}
sort(lst+1,lst+n+1);
int h = 1;
for (int i = 2; i<=n; i++)
if (lst[i]!=lst[h])
lst[++h] = lst[i];
for (int i = 1; i<=n; i++)
v[i] = lower_bound(lst+1,lst+h+1,v[i])-lst;
for (int i = 1; i<=n; i++)
{
up[i] = query(v[i]-1);
dp[i] = dp[up[i]]+1;
update(i,v[i]);
}
int best = 0;
for (int i = 1; i<=n; i++)
if (dp[best]<dp[i])
best = i;
out << dp[best] << "\n";
h = 0;
for (int i = best; i>0; i = up[i])
lst[++h] = res[i];
for (int i = h; i>0; i--)
out << lst[i] << " ";
}