Pagini recente » Monitorul de evaluare | Cod sursa (job #2009657) | Cod sursa (job #2048824) | Cod sursa (job #271731) | Cod sursa (job #2485866)
#include <cstdio>
using namespace std;
int n;
long long a[100005], v[100005], p[100005];
int lv;
int caut_bin(int x)
{
int st=0, dr=lv, pos=-1;
long long vmin=2000000005;
while(st<=dr)
{
int mij=(st+dr)/2;
if(v[mij]>=x)
{
if(vmin>a[mij])
{
vmin=a[mij];
pos=mij;
}
dr=mij-1;
}
if(v[mij]<x)
{
st=mij+1;
}
}
return pos;
}
int sol[100005];
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &n);
int vm=0;
for(int i=0; i<n; i++)
{
scanf("%d", &a[i]);
int poz=caut_bin(a[i]);
if(poz==-1)
{
v[lv++]=a[i];
p[i]=p[i-1]+1;
}
else
{
v[poz]=a[i];
p[i]=poz+1;
}
if(p[i]>p[vm])
{
vm=i;
}
}
/**for(int i=0; i<lv; i++)
printf("%d ", v[i]);
printf("\n");
for(int i=0; i<n; i++)
printf("%d ", p[i]);**/
printf("%d\n", p[vm]);
int ant=p[vm]-1, aux=lv-1;
sol[aux--]=a[vm];
for(int i=vm-1; i>=0 && aux>=0; i--)
{
if(p[i]==ant)
{
sol[aux--]=a[i];
ant--;
}
}
for(int i=0; i<lv; i++)
printf("%d ", sol[i]);
return 0;
}