Pagini recente » Cod sursa (job #2051739) | Cod sursa (job #1866326) | Cod sursa (job #811386) | Cod sursa (job #2045426) | Cod sursa (job #2327753)
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int N = 1e5+1;
int v[N],a[N],aux[N],fn[N],dp[N],poz[N],n,rez[N];
int query(int k)
{
int Max = 0;
while (k>0)
{
if (dp[fn[k]]>dp[Max])
Max = fn[k];
k-=k&-k;
}
return Max;
}
void update(int k, int val)
{
while (k<=n)
{
if (dp[val]>dp[fn[k]])
fn[k] = val;
k+=k&-k;
}
}
void rec(int i)
{
if (!poz[i])
out << rez[i] << " ";
else
{
rec(poz[i]);
out << rez[i] << " ";
}
}
int main()
{
in >> n;
for (int i = 1; i<=n; i++)
{
in >> v[i];
aux[i] = rez[i] = v[i];
}
sort(aux+1,aux+n+1);
int h = 1;
for (int i = 2; i<=n; i++)
if (aux[i]!=aux[h])
aux[++h] = aux[i];
for (int i = 1; i<=n; i++)
v[i] = lower_bound(aux+1,aux+h+1,v[i])-aux;
int ans = 0, p = 1;
for (int i = 1; i<=n; i++)
{
int r = query(v[i]-1);
dp[i] = 1+dp[r];
poz[i] = r;
update(v[i],i);
if (dp[i]>ans)
{
ans = dp[i];
p = i;
}
}
out << ans << "\n";
h = 0;
for (int i = p; i>0; i = poz[i])
aux[++h] = rez[i];
for (int i = h; i>=1; i--)
out << aux[i] << " ";
}