Pagini recente » Istoria paginii utilizator/andy_vamos | Cod sursa (job #607344) | Mihnea Andreescu | Monitorul de evaluare | Cod sursa (job #2632487)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX=1e5+1, INF1=0, INF2=2e9+1;
int dp[NMAX+1], minn[NMAX+2], arr[NMAX+1], pred[NMAX+1], sir[NMAX+1];
int binar(int val, int sz)
{
bool found=false;
int st=0, dr=sz, mj;
while(st<=dr && !found)
{
mj=(st+dr)/2;
if(arr[minn[mj]]<arr[val] && arr[minn[mj+1]]>=arr[val])
found=true;
else if(arr[minn[mj]]>=arr[val])
dr=mj-1;
else
st=mj+1;
}
return mj+1;
}
int main()
{
int N, sz=0;
fin>>N;
for(int i=1;i<=N;++i)
{
fin>>arr[i];
minn[i]=N+1;
}
arr[N+1]=INF2;
arr[0]=INF1;
for(int i=1;i<=N;++i)
{
dp[i]=binar(i, sz);
pred[i]=minn[dp[i]-1];
if(dp[i]==sz+1)
minn[++sz]=i;
else
minn[dp[i]]=i;
}
fout<<sz<<'\n';
int curent=minn[sz];
while(curent!=0)
{
sir[++sir[0]]=arr[curent];
curent=pred[curent];
}
while(sir[0]!=0)
fout<<sir[sir[0]--]<<' ';
return 0;
}