Cod sursa(job #2471923)

Utilizator CharacterMeCharacter Me CharacterMe Data 11 octombrie 2019 19:11:56
Problema Subsir crescator maximal Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>
#define f(x) x&(-x)
typedef long long ll;
ll n, i, j, k, sol, var;
ll list[100001], ind[100001], aib[100001], back[100001];
void read();
void solve();
void write();
bool comp(ll x, ll y){return list[x]<list[y];}
int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    read();
    solve();
    write();
    fclose(stdin);
    fclose(stdout);
    return 0;
}
void read(){
    scanf("%lld", &n);
    for(i=1; i<=n; ++i) {
        scanf("%lld", &list[i]);
        ind[i]=i;
    }
}
void solve(){
    std::sort(ind+1, ind+n+1, comp);
    for(i=1; i<=n; ++i){
        if(list[ind[i]]!=list[ind[i-1]]) var=i;
        back[ind[i]]=var;
    }
    for(i=1; i<=n; ++i) list[ind[i]]=i;
    for(i=1; i<=n; ++i){
        ll l=0;
        for(j=back[i]; j>0; j-=f(j)) l=std::max(l, aib[j]);
        sol=std::max(sol, ++l);
        for(j=back[i]+1; j<=n; j+=f(j)) aib[j]=std::max(l, aib[j]);
    }
}
void write(){
    printf("%lld", sol);
}