Cod sursa(job #2655677)

Utilizator evelina.nitoiuNitoiu Evelina evelina.nitoiu Data 5 octombrie 2020 10:00:57
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("scmax.in");
ofstream out("scmax.out");
vector<int> sol;
const int NMAX=100005;
int n;
int a[NMAX],poz[NMAX],da[NMAX],v[4*NMAX];
int val,pozval;
int getmax(int node,int st,int dr,int x,int y)
{
    if(x<=st&&dr<=y)
        return v[node];
    int mj=(dr+st)/2;
    int max1=0;
    int max2=0;
    if( x<=mj)
        max1=getmax(2*node,st,mj,x,y);

    if( y>mj)
        max2=getmax(2*node+1,mj+1,dr,x,y);
    return max(max1,max2);
}
void update(int node,int st,int dr,int poz,int val)
{
    int mj=(dr+st)/2;
    if( st==dr)
    {
        v[node]=val;
        return;
    }
    if(poz<=mj)
        update(2*node,st,mj,poz,val);
    else
        update(2*node+1,mj+1,dr,poz,val);
    v[node]=max(v[2*node],v[2*node+1]);

}
int main()
{
    int i;
    in>>n;
    for(i=1;i<=n;i++)
    {
        in>>a[i];
        poz[i]=a[i];
    }
    sort(a+1,a+n+1);
    for(i=1;i<=n;i++)
        poz[i]=lower_bound(a+1,a+n+1,poz[i])-a;
    for(i=1;i<=n;i++)
    {
        int maxim;
        if(poz[i]==1)
            maxim=0;
        else
            maxim=getmax(1,1,n,1,poz[i]-1);

        update(1,1,n,poz[i],maxim+1);
        da[i]=maxim+1;
        if(maxim+1>val)
        {
            val=maxim+1;
            pozval=i;
        }
    }
    out<<val<<'\n';
    for(i=pozval;i>=1;i--)
    {
        if( da[i]==val)
        {
            sol.push_back(a[poz[i]]);
            val--;
        }
    }
    for(i=sol.size()-1;i>=0;i--)
        out<<sol[i]<<" ";
    return 0;
}