Cod sursa(job #1008481)

Utilizator andreiiiiPopa Andrei andreiiii Data 11 octombrie 2013 07:23:26
Problema Subsir crescator maximal Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#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);
	}*/
}