Cod sursa(job #2080639)

Utilizator ioana_marinescuMarinescu Ioana ioana_marinescu Data 3 decembrie 2017 13:18:06
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>
const int NMAX = 100005;
using namespace std;

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

int n, a[NMAX], indice[NMAX], indice_anterior[NMAX], lungime;

int bs(int i) {
    int st=1, dr=lungime, mij, sol=0;
    while(st<=dr) {
        mij=(st+dr)>>1;
        if(a[i]>a[indice[mij]]) {
            sol=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }
    return sol+1;
}
void dinamica() {
    lungime=1;
    indice[1]=1;
    for(int i=2; i<=n; i++) {
        if(a[i]>a[indice[lungime]]) {
            lungime++;
            indice[lungime]=i;
            indice_anterior[i]=indice[lungime-1];
        }
        else {
            int pozitie=bs(i);
            indice[pozitie]=i;
            indice_anterior[i]=indice[pozitie-1];
        }
    }
}
void afis(int i) {
    if(indice_anterior[i]) {
        afis(indice_anterior[i]);
        fout<<a[indice_anterior[i]]<<" ";
    }
}
int main() {
    int i;
    fin>>n;
    for(i=1; i<=n; i++)
        fin>>a[i];
    dinamica();
    fout<<lungime<<'\n';
    afis(indice[lungime]);
    fout<<a[indice[lungime]]<<" ";
    return 0;
}