Pagini recente » Cod sursa (job #3281858) | Cod sursa (job #3335777) | Cod sursa (job #1148400) | Istoria paginii utilizator/runa | Cod sursa (job #3324215)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <stack>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int a[100005], dp[100005], p[100005], n, ind[100005], k;
void scmax2()
{
dp[1]=a[1];
p[1]=1;
int k=1;
for(int i=2; i<=n; i++)
if(a[i]>dp[k])
dp[++k]=a[i],p[i]=k;
else
{
int poz = upper_bound(dp+1,dp+k,a[i])-dp;
dp[poz]=a[i];
p[i]=poz;
}
fout<<k<<"\n";
int stop,i;
for(i=n; i>=1; i--)
if(p[i]==k)
{
stop=i;
break;
}
stack <int> st;
for(int i=stop; i>=1; i--)
{
if(p[i]==k)
{
st.push(a[i]);
k--;
}
if(k==0)
break;
}
while(!st.empty())
{
fout<<st.top()<<" ";
st.pop();
}
}
int main()
{
fin>>n;
for(int i=1; i<=n; i++)
fin>>a[i];
scmax2();
return 0;
}