Cod sursa(job #1807689)

Utilizator osiaccrCristian Osiac osiaccr Data 16 noiembrie 2016 20:42:46
Problema Subsir crescator maximal Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#define DEF 100001

using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

int n,v[DEF],R[DEF],T[DEF],i,ln,F[DEF];

int main(){
    fin >> n;

    for (i = 1; i <= n; i ++){
        fin >> v[i];
        R[i] = -1;
    }

    T[1] = 1; ln = 1;

    for (i = 2; i <= n; i++){
        if (v[i] > v[T[ln]]){
            T[ln + 1] = i;
            R[i] = T[ln];
            ln++;
        }
        else if (v[i] < v[T[1]]){
            T[1] = i;
        }
        else{
            int st,dr,mij;
            st = 1;
            dr = ln;
            while (st <= dr && st > 0 && dr < ln+1){
                mij = (st + dr)/2;
                if (v[i] != v[T[mij]]){
                    if (v[i] > v[T[mij]] && v[i] < v[T[mij + 1]]){
                        T[mij + 1] = i;
                        break;
                    } else if (v[i] > v[T[mij + 1]]){
                        st = mij + 1;
                    } else if (v[i] < v[T[mij]]){
                        dr = mij - 1;
                    }
                }
                else break;
            }
        }
    }

    fout<<ln;
    int curr = T[ln];
    for (i = ln; i >= 1; i--){
        F[i] = v[curr];
        curr = R[curr];
    }

    fout<<endl;
    for (i = 1; i <= ln; i++){
        fout<<F[i]<<" ";
    }


    return 0;
}