Cod sursa(job #2369408)

Utilizator 3DwArDPauliuc Edward 3DwArD Data 5 martie 2019 23:03:30
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int n,v[100050],length=1;
int cautb(vector<int>&a, int x){
    int i=1,j=length,mij;
    while(i<=j){
        mij=(i+j)/2;
        if(v[a[mij]]>=x)j=mij-1;
        if(v[a[mij]]<x)i=mij+1;
    }
    return mij;
}
void afisare(int x, vector<int> &prev){
    if(x<=0)return;
    afisare(prev[x], prev);
    g<<v[x]<<" ";
}
int main()
{
    f>>n;
    for(int i=1;i<=n;i++)f>>v[i];
    vector<int> a(n+2,0);
    vector<int> prev(n+2,-1);
    a[1]=1;
    for(int i=2;i<=n;i++){
        if(v[i]<v[a[1]])a[1]=i;
        else if (v[i]> v[a[length]])
            {
                prev[i] = a[length];
                a[++length]= i;
            }
        else
            {
                int pos = cautb(a, v[i]);
                prev[i] = a[pos-1];
                a[pos] = i;
            }
    }
    g<<length<<"\n";
    afisare(a[length],prev);
    return 0;
}