Pagini recente » Cod sursa (job #18394) | Cod sursa (job #2333007) | Cod sursa (job #461973) | Cod sursa (job #2582916) | Cod sursa (job #978608)
Cod sursa(job #978608)
// subsir crescator maximal cu cautare binara
#include <cstdio>
using namespace std;
int i, j, n, lung[100005],cont,maxi,sf,val[100005],aux,sol[100005];
int v[100005];
int minim(int a,int b)
{
if(a<b) return a;
return b;
}
void afisare()
{
int t;
for(t=1;t<=sf;t++)
{
printf("%d ",val[t]);
}
printf("\n");
}
int binary(int st,int dr,int x)
{
int mij;
while(st<=dr+1)
{
mij=(st+dr)/2;
// if(i==8) printf("%d\n",mij);
if(mij==dr || (val[mij]>=x && val[mij-1]<x))
{
// if(i==8) //printf("%d %d\n",val[mij],val[mij-1]);
// printf("ok");
//printf("%d %d\n",mij,val [mij]);
//afisare();
val[mij]=minim(val[mij],x);
return mij;
}
else
{
if(val[mij]>x)
{
dr=mij-1;
}
else
st=mij+1;
}
//if(i==8) //printf("%d %d\n",st,dr);
//printf("%d\n",mij);
}
}
int main() {
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&v[i]);
//printf("%d %d\n",i,v[i]);
if(v[i]>val[sf])
{
sf++;
val[sf]=v[i];
lung[i]=sf;
}
else
{
lung[i]=binary(1,sf,v[i]);
//if(i==8) printf("ok");
}
// afisare();
}
// printf("%d\n",minim(8,9));
printf("%d\n",sf);
for(i=1;i<=n;i++)
{
// printf("%d ",lung[i]);
}
int t=sf;
i=n;
cont=0;
aux=2000000000;
while (sf) {
if (lung[i] == sf && v[i]<aux) {
cont++;
sol[sf]=v[i];
aux=v[i];
sf--;
}
i--;
}
for(i=1;i<=t;i++)
{
printf("%d ",sol[i]);
}
}