Pagini recente » Cod sursa (job #398851) | Cod sursa (job #2046092) | Cod sursa (job #139846) | Cod sursa (job #2948274) | Cod sursa (job #627818)
Cod sursa(job #627818)
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMax = 100002;
int n,nN;
int v[NMax],vN[NMax],best[NMax],v2[NMax],AIB[NMax];
void citire()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
}
void normalizare()
{
for(int i=1;i<=n;i++)
v2[i]=vN[i]=v[i];
sort(vN+1,vN+n+1);
nN=1;
for(int i=2;i<=n;i++)
if(vN[i]!=vN[nN])
vN[++nN]=vN[i];
for(int i=1;i<=n;i++)
v[i]=lower_bound(vN+1,vN+nN+1,v[i])-vN;
}
void afisare()
{
int bst=0;
for(int i=1;i<=n;i++)
if(bst<best[i])
bst = best[i];
/*for(int i=1;i<=n;i++)
printf("%d ",v[i]);
printf("\n");*/
printf("%d\n",bst);
}
int query(int k)
{
int max=0;
for(;k>=1;k-=(k&(k-1))^k)
{
if(max<AIB[k])
max=AIB[k];
}
return max;
}
void update(int x,int k)
{
for(;k<=n;k+=(k&(k-1))^k)
if(AIB[k]<x)
AIB[k]=x;
}
int main()
{
freopen("scmax.in","rt",stdin);
freopen("scmax.out","wt",stdout);
citire();
normalizare();
best[1]=1;
AIB[1]=1;
for(int i=2;i<=n;i++)
{
best[i]=query(v[i])+1;
update(best[i],v[i]);
}
afisare();
return 0;
}