Cod sursa(job #2136550)

Utilizator RaduGiucleaGiuclea Radu RaduGiuclea Data 19 februarie 2018 23:04:11
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <cstdio>
#include <algorithm>
using namespace std;
struct vect{int val;int ind;};
struct di{int nr;int wh;};
vect v[100002];
di din[100002];
vect arb[300002];
int mx,indice,sol[100002],v2[100002];
int cmp(vect a,vect b)
{
    return (a.val<b.val)||(a.val==b.val&&a.ind>b.ind);
}
void recalculate(int node)
{
    if(arb[2*node].val>arb[2*node+1].val||(arb[2*node].val==arb[2*node+1].val&&arb[2*node].ind<arb[2*node+1].ind))
        arb[node]=arb[2*node];
    else arb[node]=arb[2*node+1];
}
void update(int poz,int k,int node,int st,int dr)
{
    if(poz==st&&st==dr)
        arb[node].val=k,arb[node].ind=poz;
    else
    {
        int mid=(st+dr)/2;
        if(poz<=mid)
            update(poz,k,2*node,st,mid);
        else update(poz,k,2*node+1,mid+1,dr);
        recalculate(node);
    }
}
void query(int a,int b,int node,int st,int dr)
{
    if(a<=st&&dr<=b)
    {
        if(arb[node].val>mx)
            mx=arb[node].val,indice=arb[node].ind;
    }
    else
    {
        int mid=(st+dr)/2;
        if(a<=mid)
            query(a,b,2*node,st,mid);
        if(b>=mid+1)
            query(a,b,2*node+1,mid+1,dr);
    }
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    int n,i;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&v[i].val);
        v2[i]=v[i].val;
        v[i].ind=i;
    }
    sort(&v[1],&v[n+1],cmp);
    for(i=1;i<=n;i++)
    {
        mx=-1;
        indice=0;
        query(0,v[i].ind-1,1,0,n);
        din[v[i].ind].nr=din[indice].nr+1;
        din[v[i].ind].wh=indice;
        update(v[i].ind,din[v[i].ind].nr,1,0,n);
    }
    mx=-1;
    for(i=1;i<=n;i++)
        if(din[i].nr>mx)
            mx=din[i].nr,indice=i;
    for(i=mx;i>=1;i--)
    {
        sol[i]=v2[indice];
        indice=din[indice].wh;
    }
    printf("%d\n",mx);
    for(i=1;i<=mx;i++)
        printf("%d ",sol[i]);
    return 0;
}