Cod sursa(job #1477500)

Utilizator ballsMingiuci balls Data 26 august 2015 14:19:02
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
#include <map>

using namespace std;
typedef int var;

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

int V[200000], SCM[200000], Parent[200000], T[200000];
map<int, int> Map;

#define zeros(a) (a&-a)

void update(int poz, int val) {
    for(;poz<=100000; poz += zeros(poz))
        if(SCM[T[poz]] < SCM[val])
            T[poz] = val;
}
int query(int poz) {
    int r = 0;
    for(;poz;poz-=zeros(poz))
        if(SCM[r] < SCM[T[poz]])
            r = T[poz];
    return r;
}

void afis(int i) {
    if(Parent[i]) afis(Parent[i]);
    fout<<V[i]<<" ";
}

int main() {

    int n, start = 0, val = 0;

    fin>>n;
    for(int i=1; i<=n; i++)
        fin>>V[i], Map[V[i]] = 1;

    for(auto &p : Map) p.second = ++val;
    for(int i=1; i<=n; i++) {
        Parent[i] = query(Map[V[i]] - 1);
        SCM[i] = SCM[Parent[i]] + 1;
        if(SCM[start] < SCM[i]) start = i;
        update(Map[V[i]], i);
    }

    fout<<SCM[start]<<'\n';
    afis(start);

    return 0;
}