Cod sursa(job #2343299)

Utilizator valorosu_300Cristian Gherman valorosu_300 Data 13 februarie 2019 21:08:41
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int MAX_SIZE = 100005;

int v[MAX_SIZE];
int endIndex[MAX_SIZE]; ///sfarsitul unui sc de lungime i
int predIndex[MAX_SIZE]; ///predecesorul nodului i in scm

int binarySearch(int left, int right, int val){
    int mid;
    while(left <= right){
        mid = (left + right) / 2;

        if(v[ endIndex[mid] ] >= val)
            right = mid - 1;

        else
            left = mid + 1;
    }

    return right;
}

void printSCMax(int index){
    if(index > 0){
        printSCMax(predIndex[index]);
        out<<v[index]<<" ";
    }
}

int main()
{
    int n, maxLen = 1, pos;

    in>>n;
    for(int i=1;i<=n;i++)
        in>>v[i];
    in.close();

    predIndex[1] = 0;
    endIndex[1] = 1;

    for(int i=2;i<=n;i++)
        if(v[i] <= v[ endIndex[1] ])
            endIndex[1] = i;

        else if(v[i] > v[ endIndex[maxLen] ]){
            predIndex[i] = endIndex[maxLen];
            endIndex[++maxLen] = i;
        }

        else{
            pos = binarySearch(1, maxLen, v[i]) + 1;
            predIndex[i] = endIndex[pos - 1];
            endIndex[pos] = i;
        }

    out<<maxLen<<"\n";
    printSCMax(endIndex[maxLen]);
    out.close();

    return 0;
}