Pagini recente » Cod sursa (job #2486667) | Cod sursa (job #2384122) | Cod sursa (job #1624169) | Cod sursa (job #1663062) | Cod sursa (job #906337)
Cod sursa(job #906337)
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;
int v[100100];
int n;
int size;
int d[100100]; //d[i]=pozitia celui mai mic element cu care se termina scmax de lungime i
int from[100100];
int rez;
void b_search(int st,int dr,int poz)
{
if(st<=dr)
{
int mij=(st+dr)/2;
if(v[d[mij]]<v[poz])
{
rez=mij;
b_search(mij+1,dr,poz);
}
else
b_search(st,mij-1,poz);
}
}
void getsol(int sol[1001000])
{
int poz=d[size];
while(poz)
{
sol[++sol[0]]=v[poz];
poz=from[poz];
}
reverse(sol+1,sol+sol[0]+1);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
d[++size]=1;
for(int i=2;i<=n;i++)
{
if(v[i]>v[d[size]])
{
d[++size]=i;
from[i]=d[size-1];
}
else
{
rez=0;
b_search(0,size,i);
if(v[i]<v[d[rez+1]])
{
d[rez+1]=i;
from[i]=d[rez];
}
}
}
int sol[100100];
getsol(sol);
printf("%d\n",size);
for(int i=1;i<=size;i++)
printf("%d ",sol[i]);
return 0;
}