Pagini recente » Istoria paginii runda/monthly1 | Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #1505890)
#include <bits/stdc++.h>
#define lim 100005
using namespace std;
int n,a[lim],lis[lim],poz[lim],k;
inline void Read()
{
int i;
ifstream fin("scmax.in");
fin>>n;
for(i=1;i<=n;i++)
fin>>a[i];
fin.close();
}
inline int Binar_Search(int x)
{
int st=1,dr=2,m=0,sol=k;
while(st<=dr)
{
m=(st+dr)/2;
if(lis[m]>=x)
{
sol=m;
dr=m-1;
}
else if(lis[m]<x) st=m+1;
}
return sol;
}
inline void LIS()
{
int i,p,x;
k=1;
poz[1]=1;
lis[1]=a[1];
for(i=2;i<=n;i++)
{
x=a[i];
if(x>lis[k])
{
k++;
lis[k]=x;
poz[i]=k;
}
else
if(x<=lis[1])
{
lis[1]=x;
poz[i]=1;
}
else
{
p=Binar_Search(x);
lis[p]=x;
poz[i]=p;
}
}
}
inline void Write()
{
int i;
ofstream fout("scmax.out");
fout<<k<<"\n";
for(i=1;i<=k;i++)
fout<<lis[i]<<" ";
fout<<"\n";
fout.close();
}
int main()
{
Read();
LIS();
Write();
return 0;
}