Cod sursa(job #2863256)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 6 martie 2022 15:29:49
Problema Subsir crescator maximal Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <bits/stdc++.h>
#define x(i) (i&(-i))

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

const int NMAX = 100005;
const int VALMAX = 2000000005;

pair<int,int> b[NMAX];
int a[NMAX],c[NMAX],pre[NMAX];
int aib[NMAX],dp[NMAX];
int n;

void citire(){
    fin >> n;
    for(int i=1;i<=n;i++)
        fin >> a[i];
}

void normalizare(){
    for(int i=1;i<=n;i++){
        b[i].first=a[i];
        b[i].second=i;
    }
    sort(b+1,b+n+1);
    int k=0;
    for(int i=1;i<=n;i++){
        if(b[i].first!=b[i-1].first) c[i]=++k;
        else                         c[i]=k;
    }
    for(int i=1;i<=n;i++){
        a[b[i].second]=c[i];
    } /// a este acum normalizat
}

void update_aib(int poz,int val){
    for(int i=poz;i<=n;i+=x(i))
        aib[i]=max(aib[i],val);
    return;
}

int query_aib(int poz){
    int maxim=0;
    for(int i=poz;i>=1;i-=x(i)){
        maxim=max(maxim,aib[i]);
    }
    return maxim;
}

void solve(){
    dp[1]=1;
    update_aib(a[1],dp[1]);
    for(int i=2;i<=n;i++){
        int maxim = query_aib(a[i]-1);
        dp[i]=maxim+1;
        update_aib(a[i],dp[i]);
    }
}

void afis(){
    int rasp=0,ind=0;
    for(int i=1;i<=n;i++){
        if(dp[i]>rasp){
            rasp=dp[i];
            ind=i;
        }
    }
    fout << rasp << '\n';
    /*
    for(int i=1;i<=n;i++){
        fout << a[i] << ' ';
    }
    fout << '\n';
    for(int i=1;i<=n;i++){
        fout << b[i].first << ' ' << b[i].second << '\n';
    }
    fout << '\n';
    for(int i=1;i<=n;i++){
        fout << c[i] << ' ';
    }*/
}

int main()
{
    citire();
    normalizare();
    solve();
    afis();
    return 0;
}