Pagini recente » Cod sursa (job #2118284) | Cod sursa (job #2343602) | Cod sursa (job #1695771) | Cod sursa (job #551730) | Cod sursa (job #3321469)
#include <bits/stdc++.h>
using namespace std;
int scm[100005]; /// scm[i]= elementul minim cu care se poate termina un subsir strict crescator de i elemente
int v[100005],pozScm[100005],sol[100005];
int main()
{
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int N,nr,cnt=1;
cin>>N;
for(int i=1; i<=N; i++)
{
cin>>nr;
v[i]=nr;
if(i==1)
{
scm[1]=nr;
pozScm[1]=1;
continue;
}
if(nr > scm[cnt])
{
cnt++;
scm[cnt]=nr;
pozScm[i]=cnt;
}
else
{
/// caut primul nr mai mare sau egal cu nr si il inlocuiesc
int poz = lower_bound(scm+1,scm+cnt+1,nr) -scm;
scm[poz]=nr;
pozScm[i]=poz;
}
}
cout<<cnt<<'\n';
int k=cnt;
for(int i=N;i>=1;i--)
{
if(pozScm[i]==k)
{
sol[k]=v[i];
k--;
}
}
for(int i=1;i<=cnt;i++)
{
cout<<sol[i]<<' ';
}
return 0;
}