Pagini recente » Cod sursa (job #1032205) | Cod sursa (job #1601352) | Cod sursa (job #1709208) | Cod sursa (job #1998500) | Cod sursa (job #2335482)
#include<bits/stdc++.h>
#define NMAX 100005
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int v[NMAX],tat[NMAX],l[NMAX],dp[NMAX];
int n,nr=1,poz;
int unde(int x)
{
int st=0,dr=nr,m=(st+dr)/2;
while(st<=dr)
{
if(v[l[m]]<x && x<=v[l[m+1]])
return m;
else if(v[l[m+1]]<x)
{
st=m+1;
} else dr=m-1;
m=(st+dr)/2;
}
return nr;
}
void afis(int carepecare)
{
if(tat[carepecare]>0)
afis(tat[carepecare]);
g<<v[carepecare]<<' ';
}
int main()
{
f>>n;
for(int i=1;i<=n;++i)
f>>v[i];
dp[1]=l[1]=1;
l[0]=0;
for(int i=2;i<=n;++i)
{
poz=unde(v[i]);
tat[i]=l[poz];
dp[i]=poz+1;
l[poz+1]=i;
if(poz+1>nr)
nr=poz+1;
}
int sol=0;
poz=0;
for(int i=1;i<=n;++i)
if(dp[i]>sol)
{
sol=dp[i];
poz=i;
}
g<<sol<<'\n';
afis(poz);
}