Cod sursa(job #2830544)

Utilizator Mihai_EduardMihai Eduard Mihai_Eduard Data 10 ianuarie 2022 00:37:01
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX=100005;

int N, v[NMAX], poz[NMAX], sortat[NMAX], dp[NMAX], sol, nxt=2e9+5;
/// vom determina lungimea secventei maxime care se termina
/// intr-un punct mai pic strict decat punctul curent
/// arborele va avea ca pozitii pozitiile elementelor
/// fin vectorul sortat
struct FenwickTree{
    int a[NMAX];
    void update(int x, int val)
    {
        for(int i=x;i<=N;i+=i^(i-1)&i)
            if(val>a[i])
                a[i]=val;
    }
    int query(int x)
    {
        int mx=0;
        for(int i=x;i>0;i-=i^(i-1)&i)
            if(a[i]>mx)
                mx=a[i];
        return mx;
    }
}AIB;

void afisare(int p)
{
    if(p==0)
        return;
    if(dp[p]==sol and p<nxt){
        sol--;
        afisare(p-1);
        fout<<v[p]<<' ';
        return;
    }
    afisare(p-1);
}

int main()
{
    fin>>N;
    for(int i=1;i<=N;i++){
        fin>>v[i];
        sortat[i]=v[i];
    }
    sort(sortat+1,sortat+N+1);
    for(int i=1;i<=N;i++)
        poz[i]=lower_bound(sortat+1,sortat+N+1,v[i])-sortat;

    for(int i=1;i<=N;i++){
        dp[i]=1+AIB.query(poz[i]-1);
        AIB.update(poz[i],dp[i]);
        sol=max(sol,dp[i]);
    }

    fout<<sol<<'\n';

    afisare(N);

    fin.close();
    fout.close();
    return 0;
}