Cod sursa(job #2442008)

Utilizator iulianarsenoiuArsenoiu Iulian iulianarsenoiu Data 22 iulie 2019 14:00:36
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <algorithm>

using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n,i,v[100005],l[100005],rez[100005],aib[100005],p,poz,Max,m,a[100005],b[100005],afis[100005], fr[100005];
int ub(int x)
{
    return (x&(-x));
}
void Update(int x)
{
    for(int i=x; i<=n; i+=ub(i))
        aib[i]++;
}
int sum(int x)
{
    int s=0;
    for(int i=x; i>=1; i-=ub(i))
        s+=aib[i];
    return s;
}
void normalizare()
{
    sort(b+1,b+n+1);
    a[++m]=b[1];
    for(int i=2; i<=n; i++)
    {
        if(b[i]!=b[i-1])
            a[++m]=b[i];
    }
    int st=0, dr=0, mij=0;
    int p=0;
    for(int i=1; i<=n; i++)
    {
        st=1,dr=m;
        while(st<=dr)
        {
            mij=(st+dr)/2;
            if(v[i]>=a[mij])
            {
                st=mij+1;
                p=mij;
            }
            else
                dr=mij-1;
        }
        v[i]=p;
    }
}
int main()
{
    f>>n;
    for(i=1; i<=n; i++)
    {
        f>>v[i];
        b[i]=v[i];
        afis[i]=v[i];
    }
    normalizare();
    l[1]=1;
    Update(v[1]);
    for(i=2; i<=n; i++)
    {
        l[i]=sum(v[i]-1)+1;
        if(l[i]>Max)
        {
            p=i;
            Max=l[i];
        }
        if(fr[v[i]]==0)
            Update(v[i]);
        fr[v[i]]++;
    }
    g<<Max<<'\n';
    poz=p;
    m=0;
    rez[++m]=afis[p];
    for(i=p-1; i>=1; i--)
    {
        if(l[i]==l[poz]-1 && v[i]<v[poz])
            rez[++m]=afis[i];
        poz=i;
    }
    reverse(rez+1,rez+Max+1);
    for(i=1; i<=Max; i++)
        g<<rez[i]<<' ';
    return 0;
}