Cod sursa(job #3286452)

Utilizator Robert_MitriRobert Mitri Robert_Mitri Data 14 martie 2025 11:05:50
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

const int nmax = 100000;

int n;
int v[nmax + 5];
int norm[nmax + 5];

struct elem{
int val=0;
int poz=0;
};

elem a[4*nmax + 5];
int d[nmax + 5];
int t[nmax + 5];

elem best(elem a,elem b)
{
    if(b.val > a.val)
        return b;
    return a;
}


void update(int nod,int st,int dr,int poz,int val,int rpoz)
{
    if(st==dr)
    {
        a[nod].val = max(a[nod].val,val);
        a[nod].poz = rpoz;
        return;
    }
    int mid = (st+dr) /2;
    if(poz<=mid)
        update(nod*2,st,mid,poz,val,rpoz);
    else
        update(nod*2+1,mid+1,dr,poz,val,rpoz);
    a[nod]=best(a[nod*2],a[nod*2+1]);
}
elem query(int nod,int st,int dr,int x,int y)
{
    if(x<=st && dr<=y)
        return a[nod];
    int mid = (st+dr)/2;
    elem r1,r2;
    if(x<=mid) r1 = query(nod*2,st,mid,x,y);
    if(y>mid) r2=query(nod*2+1,mid+1,dr,x,y);
    return best(r1,r2);
}


int main()
{
    fin>>n;
    vector <int> ax;
    for(int i=1;i<=n;i++){
        fin>>v[i];
        ax.push_back(v[i]);
    }
    sort(ax.begin(),ax.end());
    ax.resize(unique(ax.begin(),ax.end())-ax.begin());
    for(int i=1;i<=n;i++)
        norm[i] = lower_bound(ax.begin(),ax.end(),v[i])-ax.begin()+1;
    int nrmsz = ax.size();
    int sol = 0;
    int lt;
    for(int i=1;i<=n;i++)
    {
        if(norm[i]==1)
            d[i]=1;
        else{
            elem x = query(1,1,nrmsz,1,norm[i]-1);
            d[i] = x.val+1;
            t[i] = x.poz;
        }
        update(1,1,nrmsz,norm[i],d[i],i);
        if(d[i] > sol)
            lt = i,sol=d[i];
    }
    fout<<sol<<'\n';
    vector <int> ssz;
    while(t[lt]){
        ssz.push_back(lt);
        lt=t[lt];
    }
    ssz.push_back(lt);
    reverse(ssz.begin(),ssz.end());
    for(auto &i : ssz)
        fout<<v[i]<<' ';
}