Cod sursa(job #2267049)

Utilizator OvidiuDestulDeOkNicoleanu Ovidiu OvidiuDestulDeOk Data 23 octombrie 2018 10:32:41
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#define NMAX 100028
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

int lgmax, n, maxim;
int a[NMAX], pos[NMAX], best[NMAX], s[NMAX];

void read();
void pd();
int searchbin(int x);
void print();
int main()
{
    read();
    pd();
    print();
    return 0;
}

void read(){
    int i;
    fin >> n;
    for(i = 1; i <= n; i++)
        fin >> a[i];
    pos[1] = 1; best[1] = a[1]; lgmax = 1;
}

void pd(){
    int i, position;
    for(i = 2; i <= n; i++){
        if(a[i] > best[lgmax]){
            best[++lgmax] = a[i];
            pos[i] = lgmax;
        }
        else{
            position = searchbin(a[i]);
            best[position] = a[i];
            pos[i] = position;
        }

    }
}

//caut binar in best cel mai mic nr >= a[i] si returnez pozitia lui
int searchbin(int x){
    int st = 0, dr = lgmax + 1, mid;
    while(dr - st > 1){
        mid = (st + dr) / 2;
        if(a[mid] >= x)
            dr = mid;
        else
            st = mid;
    }
    return dr;
}

void print(){
    int i, j;
    fout << lgmax << '\n';
    for(i = n, j = lgmax; i >= 1 && j; i--)
        if(pos[i] == j){
            s[j] = a[i];
            j--;
        }
    for(i = 1; i < lgmax; i++)
        fout << s[i] << ' ';
    fout << s[i] << '\n';
}