Pagini recente » Cod sursa (job #1822770) | Cod sursa (job #820805) | Cod sursa (job #548061) | Cod sursa (job #1529249) | Cod sursa (job #2327756)
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int N = 1e5+5;
int v[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;
}
}
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;
for (int i = 1; i<=n; i++)
{
poz[i] = query(v[i]-1);
dp[i] = 1+dp[poz[i]];
update(v[i],i);
if (dp[i]>dp[ans])
ans = i;
}
out << dp[ans] << "\n";
h = 0;
for (int i = ans; i>0; i = poz[i])
aux[++h] = rez[i];
for (int i = h; i>=1; i--)
out << aux[i] << " ";
}