Cod sursa(job #1938405)

Utilizator ScarymovieMocanu Alexandru Scarymovie Data 24 martie 2017 19:57:53
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include<vector>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
vector<int> arb,v,l,pre;
int b,a,c,maxim,n,M,k;
void Update(int nod,int st,int dr)
{
    if(st==dr)
    {
        arb[nod]=b+1;
        return ;
    }
    int mij=(st+dr)/2;
    if(b+1<=mij) Update(2*nod,st,mij);
    else Update(2*nod+1,mij+1,dr);
    if(v[arb[2*nod]]>v[arb[2*nod+1]]) arb[nod]=arb[2*nod];
    else arb[nod]=arb[2*nod+1];
}
void best(int nod,int st,int dr)
{
    int mij=(st+dr)/2;
    if(st>=a && dr<=b)
        {if(v[arb[nod]]<c)
        {
            if(l[arb[nod]]>l[maxim]) maxim=arb[nod];
            return ;
        }
        if(st==dr) return ;}
    if(mij>=a) best(2*nod,st,mij);
    if(mij+1<=b) best(2*nod+1,mij+1,dr);
}
void afiseaza(int k)
{
    if(pre[k]) afiseaza(pre[k]);
    g<<v[k]<<' ';
}
int main()
{
    f>>n;
    arb.resize(2*n);
    v.resize(n+1);
    l.resize(n+1);
    pre.resize(n+1);
    for(int i=1; i<=n; i++)
    {
        f>>v[i];
        a=1;
        b=i-1;
        c=v[i];
        maxim=0;
        if(i>1) best(1,1,n);
        l[i]=l[maxim]+1;
        pre[i]=maxim;
        Update(1,1,n);
        if(M<l[i])
        {
            M=l[i];
            k=i;
        }
    }
    g<<M<<'\n';
    afiseaza(k);
    return 0;
}