Cod sursa(job #2950697)

Utilizator Pop_EmilPal Tamas Pop_Emil Data 4 decembrie 2022 15:18:21
Problema Subsir crescator maximal Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>
#include <map>
#include <algorithm>

using namespace std;

#define NMax 100005

FILE *in = fopen("scmax.in", "r"), *out = fopen("scmax.out", "w");

int N;
int a[NMax], comp[NMax], BIT[NMax] = {0};

int query(int index){
    int ML = 0, i = index;
    while (i > 0){
        if (BIT[i] > ML)
            ML = BIT[i];
        i = i - (i & (-i));
    }
    return ML;
}

int main()
{
    // Read array
    fscanf(in, "%d", &N);
    for (int i = 1; i <= N; ++i){
        fscanf(in, "%d", &a[i]);
        comp[i] = a[i];
    }

    // Coordinate compression
    sort(comp + 1, comp + N + 1);
    map<int, int> comp_mapping;
    int j = 1;
    for (int i = 1; i <= N; ++i){
        if(i >= 2 && comp[i] == comp[i-1])
            continue;
        comp_mapping[comp[i]] = j;
        ++j;
    }
    for (int i = 1; i <= N; ++i){
        comp[i] = comp_mapping[a[i]];
    }

    // Construct BIT of max lengths
    int max_length;
    for (int i = 1; i <= N; ++i){
        // Get max length up until now (?)
        max_length = query(comp[i] - 1);
        // Update nodes of BIT
        j = comp[i];
        while(j <= N){
            BIT[j] = max(BIT[j], max_length + 1);
            j = j + (j & (-j));
        }

    }

    // Get max increasing subsequence length
    max_length = 0;
    for (int i = 1; i <= N; ++i){
        if (BIT[i] > max_length)
            max_length = BIT[i];
    }
    fprintf(out, "%d\n", max_length);

    // Get one such subsequence

    return 0;
}