Pagini recente » Cod sursa (job #932463) | Cod sursa (job #3240332) | Cod sursa (job #679150) | Monitorul de evaluare | Cod sursa (job #2460550)
#include <bits/stdc++.h>
#define val first
#define poz second
using namespace std;
int a[100001],n;
int bac[100001];
pair <int,int> lung[100001];
int lgmx;
int sol[100001],nrsol;
int find_bin(int st,int dr,int val)
{
while(st<=dr)
{
int m=(st+dr)/2;
if(lung[m].val>val)
dr=m-1;
else
st=m+1;
}
if(lgmx<st && lung[lgmx].val!=val)
lgmx++;
return st;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
int poz=find_bin(1,lgmx,a[i]);
if(!lung[poz].val || a[i]!=lung[poz-1].val)
{
bac[i]=lung[poz-1].poz;
lung[poz].val=a[i];
lung[poz].poz=i;
}
}
int k=lung[lgmx].poz,nrsol=0;
while(k)
{
sol[++nrsol]=a[k];
k=bac[k];
}
cout<<lgmx<<'\n';
while(nrsol)
cout<<sol[nrsol--]<<' ';
}