Cod sursa(job #2241944)

Utilizator AnDrEeA1915Monea Andreea AnDrEeA1915 Data 17 septembrie 2018 15:20:15
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include<fstream>
#define nmax 100005
using namespace std;

ifstream fin ("scmax.in");
ofstream  fout ("scmax.out");
int v[nmax], a[nmax], pred[nmax], n, l;

int BS(int start , int finish, int val) {
    int s = start, f = finish, mij, pos = 0;
    while(s <= f && pos == 0) {
        mij = (s + f) /2 ;
        if(v[a[mij]] < val && val < v[a[mij+1]])
            pos = mij + 1;
        else if(val > v[a[mij]])
            s = mij + 1;
        else f = mij - 1;
    }
    return pos;
}

void MIS() {
    int i, pos;
    l = 1;
    a[1] = 1;
    for(i = 2; i <= n; i++) {
        if(v[i] > v[a[l]]) {
            l++;
            a[l] = i;
            pred[i] = a[l-1];
        }
        else if(v[i] < v[a[1]])
            a[1] = i;
        else {
            pos = BS(1, l, v[i]);
            a[pos] = i;
            pred[i] = a[pos-1];
        }
    }
}

void afis(int x) {
    if(x) {
        afis(pred[x]);
        fout << v[x]<< " ";
    }
}

int main()
 {
    fin >> n;
    for(int i = 1; i <= n; i++)
        fin >> v[i];

    MIS();
    fout << l << endl;

    afis(a[l]);
    fout << endl;
    return 0;
}