Cod sursa(job #1090043)

Utilizator IonSebastianIon Sebastian IonSebastian Data 22 ianuarie 2014 11:54:29
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

const int N = 100001;

int v[N], w[N], x[N], n, i, aib[N], lung, imax, maxim, final[N], l[N];

bool cmp(int p1, int p2){
    return v[p1] < v[p2];
}

void update(int p, int val){
    while(p <= n){
        if(aib[p] < val){
            aib[p] = val;
        }
        p += p&(-p);
    }
}

int query(int val){
    int s = 0;
    while(val){
        if(aib[val] > s){
            s = aib[val];
        }
        val -= val & (-val);
    }
    return s+1;
}

int main()
{
    in >> n;
    for(i = 1; i <= n; i++){
        in >> v[i];
        w[i] = i;
    }
    sort(w+1, w+n+1, cmp);
    for(i = 1; i <= n; i++){
        if(i > 1 && v[w[i]] == v[w[i-1]]){
            x[w[i]] = x[w[i-1]];
        } else {
            x[w[i]] = i;
        }
    }
    for(i = 1; i <= n; i++){
        lung = query(x[i]-1);
        if(lung > maxim){
            maxim = lung;
            imax = i;
        }
        update(x[i], lung);
        l[i] = lung;
    }
    /*for(i = 1; i <= n; i++){
        out << x[i] << " ";
    }*/
    lung = maxim;
    int ceva = 0;
    final[ceva] = v[imax];
    for(i = n; i >= 1; i--){
        if(l[i] == lung-1){
            final[++ceva] = v[i];
            lung--;
        }
    }
    out << maxim << "\n";
    for(i = maxim-1; i >= 0; i--){
        out << final[i] << " ";
    }
    return 0;
}