Cod sursa(job #1008690)

Utilizator andreiiiiPopa Andrei andreiiii Data 11 octombrie 2013 17:13:59
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#include <algorithm>
#define N 100005
#define zeros(x) (((x)^(x-1))&(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], d[N], nxt[N], sols[N];
 
void update(int poz, int val)
{
    for(;poz<N;poz+=zeros(poz))
    {
        if(d[val]>d[aib[poz]])
        {
            aib[poz]=val;
        }
    }
}
 
int query(int poz)
{
    int ret=0;
    for(;poz;poz-=zeros(poz))
    {
        if(d[aib[poz]]>d[ret])
        {
            ret=aib[poz];
        }
    }
    return ret;
}
 
int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    int n, i, k=1, sol=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=1;i<=n;i++)
    {
        nxt[i]=query(a[i].y-1);
        d[i]=d[nxt[i]]+1;
        if(d[i]>d[sol])
        {
            sol=i;
        }
        update(a[i].y, i);
    }
    printf("%d\n", d[sol]);
	for(i=sol;i;i=nxt[i])
	{
		//printf("%d", i);
		sols[++sols[0]]=a[i].x;
	}
	for(i=sols[0];i;i--)
	{
		printf("%d ", sols[i]);
	}
}