Cod sursa(job #3345581)

Utilizator altomMirel Fanel altom Data 10 martie 2026 09:51:46
Problema Subsir crescator maximal Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <fstream>
#include <unordered_map>
#include <algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

const int NMAX=1e5+5;
unordered_map<int, int> um;
int n, i;
pair<int, int> aib[NMAX];
int v[NMAX], a[NMAX];

void update(int p, int x){
    for(int i=p;i<=n;i+=(i&-i)){
        if(x>aib[i].first){
            aib[i].first=x;
            aib[i].second=p;
        }
    }
}

pair<int, int> query(int p){
    int ans=0;
    int poz=0;
    for(int i=p;i>0;i-=(i&-i)){
        if(ans<=aib[i].first){
            ans=aib[i].first;
            poz=aib[i].second;
        }
    }

    return {ans, poz};
}

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

    sort(a+1,  a+n+1);

    int cnt=0;
    for(i=1;i<=n;i++){
        if(a[i]!=a[i-1])
            um[a[i]]=++cnt;
    }

    for(i=1;i<=n;i++){
        int poz=um[v[i]];
        //cout<<poz<<'\n';
        pair<int, int> ans=query(poz-1);
        update(poz, ans.first+1);
    }


    fout<<query(n).first;



    return 0;
}