Mai intai trebuie sa te autentifici.

Cod sursa(job #1345104)

Utilizator horiainfoTurcuman Horia horiainfo Data 17 februarie 2015 11:45:46
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <cstdio>
#define NMAX 100001
using namespace std;
ofstream fout("scmax.out");
int n,lg,x;
struct v1{int val,pre;} a[NMAX];
struct v2{int bst,poz;} arb[NMAX*2];
int k[NMAX];
void adaug(int lg,int poz)
{
    int tata=1,inc=1,sf=n;
    while(inc!=sf)
    {
        if(poz>(inc+sf)/2) tata=tata*2+1,inc=(inc+sf)/2+1;
        else tata=tata*2,sf=(inc+sf)/2;
    }
    while(arb[tata].bst<lg && tata>=1)
    {
        arb[tata].bst=lg,arb[tata].poz=poz;
        tata=tata/2;
    }
}
v2 determin(int nod,int inc,int sf)
{
    if(a[arb[nod].poz].val < x)
        return arb[nod];

    int mij=(inc+sf)/2;
    v2 st=determin(nod*2,inc,mij);
    v2 dr=determin(nod*2+1,mij+1,sf);
    v2 k; k.poz=0,k.bst=0;
    if(x>a[st.poz].val) k=st;
    if(x>a[dr.poz].val && dr.bst>st.bst) k=dr;
    return k;
}
int caut(int poz)
{
    v2 d = determin(1,1,n);
    adaug(d.bst+1,poz);
    return d.poz;
}
void afis(int poz)
{
    while(poz!=0)
        k[++lg]=a[poz].val,poz=a[poz].pre;
    fout<<lg<<'\n';
    for(int i=lg;i>=1;i--)
        fout<<k[i]<<' ';
}
int main()
{
    freopen("scmax.in","r",stdin);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i].val);
        x=a[i].val;
        a[i].pre=caut(i);
    }
    afis(arb[1].poz);
    return 0;
}