Cod sursa(job #1019574)

Utilizator vladstoickvladstoick vladstoick Data 31 octombrie 2013 15:39:21
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <fstream>

using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int N = 100010;
int maxstep=1;
int v[N], u[N],pred[N];
int n,m,j;
void afis(int x){
    if(x==0) return;
    afis(pred[x]);
    out<<v[x]<<" ";
}
int cautbinar(int x){
    int rezultat=0;
    while(maxstep*2<=m){
        maxstep<<=1;
    }
    for(int step = maxstep; step>0 ; step>>=1){
        if(v[u[rezultat+step]]<x && rezultat+step <= m){
            rezultat += step;
        }
    }
    return rezultat+1;
}
int main()
{
    in>>n;

    for(int i=1;i<=n;i++){
        in>>v[i];
    }
    u[++m]=1;
    for(int i=2;i<=n;i++){
        j=cautbinar(v[i]);
        pred[i]=u[j-1];
        u[j]=i;
        if(j==m+1) m++;
    }
    out<<m<<"\n";
    afis(u[m]);
    return 0;
}