Pagini recente » Cod sursa (job #2831512) | Cod sursa (job #1999850) | Cod sursa (job #713475) | Cod sursa (job #3151672) | Cod sursa (job #978261)
Cod sursa(job #978261)
// subsir crescator maximal cu cautare binara
#include <cstdio>
using namespace std;
int i, j, n, lung[100005],cont,maxi,sf,val[100005],sol;
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();
if(lung[i]>sol) sol=lung[i];
}
// printf("%d\n",minim(8,9));
printf("%d\n",sf);
}