Cod sursa(job #1803704)

Utilizator ASTELOTudor Enescu ASTELO Data 11 noiembrie 2016 18:13:56
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int v[100006],lp[100004],aib[100006],v1[100001],v2[100001];
int n,i,j,m,maxim,poz,cate;
void update(int poz,int val)
    {
    while(poz<=n)
        {
        if(v[val]>v[aib[poz]])
            aib[poz]=val;
        poz+=(poz^(poz&poz-1));
        }
    }
int query(int poz)
    {
    int p1=0;
    while(poz>=1)
        {
        if(v[aib[poz]]>v[p1])
            p1=aib[poz];
        poz-=(poz^(poz&poz-1));
        }
    return p1;
    }
int main ()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
    {
    scanf("%d",&lp[i]);
    v1[i]=lp[i];
    }
sort(lp+1,lp+n+1);
for(i=1;i<=n;i++)
    {
    int l1,l2,mid,o=0;
    l1=1;
    l2=n;
    while(l1<=l2)
        {
        mid=(l1+l2)/2;
        if(lp[mid]==v1[i])
            {
            o=mid;
            l2=mid-1;
            }
        else
            if(lp[mid]>v1[i])
                l2=mid-1;
            else
                l1=mid+1;
        }
    v2[i]=o;
    }
for(i=1;i<=n;i++)
    {
    int val1=query(v2[i]-1);
    v[i]=v[val1]+1;
    update(v2[i],i);
    }
for(i=1;i<=n;i++)
    if(v[i]>maxim)
        maxim=v[i];
printf("%d\n",maxim);
for(i=n;i>=1;i--)
    if(v[i]==maxim)
        {
        v2[++cate]=i;
        maxim--;
        }
for(i=cate;i>=1;i--)
    printf("%d ",v1[v2[i]]);
return 0;
}