Cod sursa(job #3004247)

Utilizator Paul281881818818181991919191881818Draghici Paul Paul281881818818181991919191881818 Data 16 martie 2023 10:48:24
Problema Subsir crescator maximal Scor 85
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
#include <vector>
std::ifstream fin("scmax.in");
std::ofstream fout("scmax.out");
int n;
std::vector<int> arr, D, pos, I;

int main(){
    int k = 0;
    fin >> n;
    arr = D = pos = I = std::vector<int> (n + 1);
    for(int i = 1; i <= n; i++){
        fin >> arr[i];
    }
    D[++k] = arr[1];
    for(int i = 2; i <= n; i++){
        if(arr[i] > D[k]){
            D[++k] = arr[i];
            pos[i] = k;
        }
        else if(arr[i] < D[k]){
            int left = 1, right = k, poz = k + 1;
            while(left <= right){
                int mid = left + (right - left)/2;
                if(D[mid] > arr[i]){
                    poz = mid;
                    right = mid - 1;
                }
                else{
                    left = mid + 1;
                }
            }
            D[poz] = arr[i];
            pos[i] = poz;
        }
    }
    fout << k << "\n";
    int j = n;
    for(int i = k; i >= 1; i--){
        while(pos[j] != i){
            j --;
        }
        I[i] = j;
    }
    for(int i = 1; i <= k; i++){
        fout << arr[I[i]] << " ";
    }

}