Cod sursa(job #1562733)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 5 ianuarie 2016 13:54:13
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

const int MAX_N = 100000;

int n, norm;
pair < int, int > N[1 + MAX_N];
int Prev[1 + MAX_N];
int V[1 + MAX_N];
int T[1 + MAX_N];
pair < int, int > AIB[1 + MAX_N];

bool normSort(pair < int, int > A, pair < int, int > B) {
    return get<0>(A) < get<0>(B);
}

int lsb(int x) {
    return x & (-x);
}

void update(int i, pair < int, int > maxval) {
    for(; i <= norm; i += lsb(i)) {
        if(get<0>(AIB[i]) < get<0>(maxval)) {
            AIB[i] = maxval;
        }
    }
}

pair < int, int > query(int i) {
    pair < int, int > ans = make_pair(0, 0);
    for(; i; i -= lsb(i)) {
        if(get<0>(ans) < get<0>(AIB[i])) {
            ans = AIB[i];
        }
    }
    return ans;
}

void print(int ind) {
    if(Prev[ind] > 0) print(Prev[ind]);
    out << T[ind] << ' ';
}

int main() {
    int n, i, j, bestval = 0, bestind = 0;
    pair < int, int > qret;

    in >> n;
    for(i = 1; i <= n; i++) {
        in >> V[i];
        T[i] = V[i];
        N[i] = make_pair(V[i], i);
    }
    sort(N+1, N+n+1, normSort);
    for(i = 1; i <= n; i++) {
        for(j = i; get<0>(N[j]) == get<0>(N[i]); j++) {
            V[get<1>(N[j])] = norm + 1;
        }
        i = j - 1;
        norm++;
    }

    for(i = 1; i <= n; i++) {
        qret = query(V[i] - 1);
        if(bestval < get<0>(qret) + 1) {
            bestval = get<0>(qret) + 1;
            bestind = i;
        }
        Prev[i] = get<1>(qret);
        update(V[i], make_pair(get<0>(qret) + 1, i));
    }

    out << bestval << '\n';
    print(bestind);

    return 0;
}