Cod sursa(job #1510234)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 24 octombrie 2015 18:39:46
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <cstdio>
#include <algorithm>

FILE *fin,*fout;

struct myaib
{
    int val,pos;
    myaib(int x=0,int y=0){val=x;pos=y;}
}aib[100001],arr[100001];

int order[100001],v[100001],maxx,poz,solve[100001];
int n,nr;

int cauta(int x)
{
    return std::lower_bound(order+1,order+1+n,x)-order;
}

myaib query(int i)
{
    myaib res;
    for(;i>0;i-=i&(-i))
    {
        if(aib[i].val>res.val)
        {
            res=aib[i];
        }
    }
    return res;
}

void update(int x,int pos,int i)
{
    for(;i<=n;i+=i&(-i))
    {
        if(x>aib[i].val)
        {
            aib[i]=myaib(x,pos);
        }
    }
}

int main()
{
    fin=fopen("scmax.in","r");
    fout=fopen("scmax.out","w");

    fscanf(fin,"%d",&n);

    for(int i=1;i<=n;i++)
    {
        fscanf(fin,"%d",&v[i]);
        order[i]=v[i];
    }

    std::sort(order+1,order+1+n);

    for(int i=1;i<=n;i++)
    {
        arr[i]=query(cauta(v[i])-1);
        arr[i].val++;
        update(arr[i].val,i,cauta(v[i]));
        if(arr[i].val>maxx)
        {
            poz=i;
            maxx=arr[i].val;
        }
    }

    for(int i=poz;i>0;i=arr[i].pos)
    {
        nr++;
        solve[nr]=v[i];
    }

    fprintf(fout,"%d\n",nr);

    for(int i=nr;i;i--)
    {
        fprintf(fout,"%d ",solve[i]);
    }
}