Pagini recente » Cod sursa (job #1218129) | Cod sursa (job #2205066) | Cod sursa (job #1238085) | Statistici madalina marin (madalina234) | Cod sursa (job #3302364)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
const int nmax=1e5+5;
const int inf=2e9+5;
int n, v[nmax], dp[nmax], ult[nmax];
int cb (int i)
{
int st=1, dr=n, poz=0;
while (st<=dr)
{
int mij=(st+dr)/2;
if (v[i]>v[dp[mij]])
{
st=mij+1;
poz=mij;
}
else
dr=mij-1;
}
return poz;
}
void afis (int i)
{
if (i==0)
return;
afis(ult[i]);
fout << v[i] << " ";
}
void pd ()
{
//dp[lg]=val min care poate fi pusa la finalul unui scmax de lungime lg
v[0]=-inf;
v[n+1]=inf;
for (int i=1; i<=n; i++)
dp[i]=n+1;
int rez=0;
for (int i=1; i<=n; i++)
{
int poz=cb(i)+1;
dp[poz]=i;
ult[i]=dp[poz-1];
rez=max(rez,poz);
}
fout << rez << '\n';
afis(dp[rez]);
}
signed main()
{
fin >> n;
for (int i=1; i<=n; i++)
fin >> v[i];
pd();
return 0;
}