Cod sursa(job #1646969)

Utilizator RaZxKiDDavid Razvan RaZxKiD Data 10 martie 2016 18:25:42
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int V[100005],T[100005],R[100005],len=0,n;
stack<int> S;
int bs(int x){
    int st=0;
    int dr=len;
    int mij;
    while(st<=dr){
        mij=(st+dr)/2;
        if(x>V[T[mij]])
            st=mij+1;
        else dr=mij-1;
    }
    return st;
}
int main(){
    int indx,x;
    in>>n;
    R[0]=-1;
    T[0]=0;
    for(int i=0;i<n;i++){
        in>>V[i];
        R[i]=-1;
    }
    for(int i=1;i<n;i++){
        if(V[i]<V[T[0]]){ //! daca e mai mic decat prima valoare
            T[0]=i;
        }
        else if(V[i]>V[T[len]]){ //! daca e mai mare decat ultima val(len)
            T[++len]=i;
            R[T[len]]=T[len-1];
        }
        else{ //! daca nu,  binary search pentru pozitie
            indx=bs(V[i]);
            T[indx]=i;
            R[T[indx]]=T[indx-1];
        }
    }
    out<<len+1<<"\n";
    x=T[len];
    for(int i=0;i<=len;i++){
        S.push(V[x]);
        x=R[x];
    }
    while(!S.empty()){
        out<<S.top()<<" ";
        S.pop();
    }
    return 0;
}