Cod sursa(job #901646)

Utilizator costyv87Vlad Costin costyv87 Data 1 martie 2013 11:04:56
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
//HighFlow
//Subsir crescator maximal cu AIB -bad idea
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <fstream>
#include <string.h>
#include <cmath>
#include <algorithm>
#define fcat(c) while (c!='\n') fscanf(f,"%c",&c)
#define cat(c) while (c!='\n') scanf("%c",&c)
#define For(i,st,dr,k) for (int i=st;i<=dr;i+=k)
#define ll (long long)
using namespace std;
FILE *g;

int T[100100];
struct cp{int x,y; } d[100100];
int v[100100];
int ax[100100];
int h[100100];
int bk[100100];
int n,cn,i,j,sol;


bool cmp(cp A,cp B)
{
    return A.x<=B.x;
}

void update(int x,int val)
{
    int i;
    for (i=x;i<=n;i=i+ax[i])
        T[i]=max(T[i],val);
}

inline int query(int x)
{
    int mx=-1,i;
    for (i=x;i>0;i=i-ax[i])
        mx=max(mx,T[i]);
    return mx;
}

void rec(int ind,int x)
{
    if (x==0) return;

    while (bk[ind]!=x) ind--;
    rec(ind,x-1);
    fprintf(g,"%d ",v[ind]);
}

int main()
{
    ifstream f("scmax.in");
    g=fopen("scmax.out","w");

    f>>n;
    for (i=1;i<=n;i++)
    {
        f>>v[i];
        d[i].x=v[i];
        d[i].y=i;
    }
    stable_sort(d+1,d+n+1,cmp);

    for (i=1;i<=n;i++)
        ax[i]=i&(-i);

    for (i=1,cn=0;i<=n;i=j,cn++)
    {
        for (j=i;d[j].x==d[i].x && j<=n;j++)
        {
            h[d[j].y]=cn;
        }
    }

    for (i=1;i<=n;i++)
    {
        if (h[i]==0)
        {
            bk[i]=1;
            update(1,bk[i]);
        }
        else
        {
            bk[i]=query(h[i])+1;
            update(h[i]+1,bk[i]);
        }
    }

    sol=query(cn);
    fprintf(g,"%d\n",sol);
    rec(n,sol);
	return 0;
}