Cod sursa(job #1795578)

Utilizator grimmerFlorescu Luca grimmer Data 2 noiembrie 2016 17:51:06
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 100003
using namespace std;

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

struct elem{
    int val, pos;
}v[NMAX + 5];

int BITree[NMAX + 5], n, parent[NMAX + 5], best[NMAX + 5], ans_list[NMAX + 5];

bool cmp(elem a, elem b){
    if(a.val == b.val){
        return a.pos > b.pos;
    }

    return a.val < b.val;
}

int Query(int pos){
    int i, ans = 0;

    for(i = pos; i > 0; i -= i & (-i)){
        if(best[BITree[i]] > best[ans])   ans = BITree[i];
    }

    return ans;
}

void Update(int pos, int val){
    int i;

    for(i = pos; i <= n; i += i & (-i)){
        if(best[BITree[i]] < best[val])  BITree[i] = val;
    }

}

int main ()
{
    int i, last_elem, cnt = 0;
    fin>>n;

    for(i = 1; i <= n; ++i){
        fin>>v[i].val;
        v[i].pos = i;
    }
    sort(v + 1, v + 1 + n, cmp);

    for(i = 1; i <= n; ++i){
        parent[i] = Query(v[i].pos - 1);
        best[i] = best[parent[i]] + 1;
        Update(v[i].pos, i);
    }

    last_elem = Query(n);

    fout<< best[last_elem] << "\n";

    while(parent[last_elem] != 0){
        ans_list[++cnt] = last_elem;
        last_elem = parent[last_elem];
    }

    ans_list[++cnt] = last_elem;

    if(best[last_elem] != 0){
        for(i = cnt; i > 0; --i){
            fout<< v[ans_list[i]].val << " ";
        }
    }

    return 0;
}