Cod sursa(job #2170476)

Utilizator markyDaniel marky Data 15 martie 2018 01:55:21
Problema Subsir crescator maximal Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#include <stack>
#include <vector>

using namespace std;

ifstream f("scmax.in");
ofstream g("scmax.out");

const int nmax = 100005;

int GetCeilIndex(int arr[], vector<int> &T, int l, int r, int key){
while((r - l) > 1){
    int m = (l+r)/2;
    if(arr[T[m]] >= key)r = m;
    else l = m;
}
return r;
}

void LIS(int n, int arr[]){
if(n == 0)return;

vector<int>tailIndex(n, 0);
vector<int>prevIndex(n,-1);

int len = 1;
for(int i=1;i<n;++i)
if(arr[i] < arr[tailIndex[0]])
tailIndex[0] = i;
else if(arr[i] > arr[tailIndex[len-1]]){
    prevIndex[i] = tailIndex[len-1];
    tailIndex[len++] = i;
}
else {
    int pos = GetCeilIndex(arr, tailIndex, -1, len-1, arr[i]);
    prevIndex[i] = tailIndex[pos-1];
    tailIndex[pos] = i;
}

g<<len<<'\n';
stack<int>s;
for(int i = tailIndex[len-1]; i>=0; i = prevIndex[i])
    s.push(arr[i]);

while(!s.empty()){
    g<<s.top()<<" ";
    s.pop();
}
g<<'\n';
}

int arr[nmax];

int main()
{
    int n;
    f>>n;
    for(int i=0;i<n;++i)
        f>>arr[i];

    LIS(n,arr);
    return 0;
}