Cod sursa(job #3002412)

Utilizator Paul281881818818181991919191881818Draghici Paul Paul281881818818181991919191881818 Data 14 martie 2023 18:52:30
Problema Subsir crescator maximal Scor 45
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 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{
            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 << I[i] << " ";
    }

}