Pagini recente » Cod sursa (job #2587963) | Cod sursa (job #669261) | Cod sursa (job #564386) | Cod sursa (job #977869) | Cod sursa (job #1008481)
#include <cstdio>
#include <algorithm>
#define N 100002
#define zeros(x) ((x)&(-x))
using namespace std;
struct nr
{
int x, y;
bool operator < (const nr &e) const
{
return x>e.x;
}
};
nr a[N], b[N];
int aib[N], aibn[N], nxt[N];
int poz, n;
void update(int i, int val, int z)
{
for(;i<=n;i+=zeros(i))
{
if(val>aib[i])
{
aib[i]=val;
aibn[i]=z;
}
}
}
int query(int i)
{
int ret=0;
poz=0;
for(;i>0;i-=zeros(i))
{
if(aib[i]>ret)
{
ret=aib[i];
poz=aibn[i];
}
}
return ret;
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int i, k=0, sol=0, soli=0;
scanf("%d", &n);
for(i=1;i<=n;i++)
{
scanf("%d", &a[i].x);
b[i].x=a[i].x;
b[i].y=i;
}
sort(b+1, b+n+1);
for(i=1;i<=n;i++)
{
if(b[i].x!=b[i-1].x) k++;
a[b[i].y].y=k;
}
for(i=n;i>0;i--)
{
k=query(a[i].y-1);
k++;
if(k>sol)
{
sol=k;
soli=i;
}
nxt[i]=poz;
update(a[i].y, k, i);
}
printf("%d\n", sol);
/*if(sol) for(i=soli;i>0&&i<=n;i=nxt[i])
{
printf("%d ", a[i].x);
}*/
}