Cod sursa(job #2020953)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 12 septembrie 2017 14:12:40
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <stdio.h>
#include <algorithm>
#define MAX 100005
#define zeros(x) (x & (-x))
using namespace std;

int n, m, t, x, y, i;
int v[MAX], l[MAX], aib[MAX], d[MAX], res[MAX], up[MAX];

void update(int pos, int val){
    int i;
    for(i = pos; i <= n; i += zeros(i))
        if(d[val] > d[aib[i]])
            aib[i] = val;
}

int query(int x){
    int res = 0;
    while(x){
        if(d[aib[x]] > d[res])
            res = aib[x];
        x -= zeros(x);
    }
    return res;
}

int main(){
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d", &n);
    for(i = 1; i <= n; ++i){
        scanf("%d", &v[i]);
        res[i] = l[i] = v[i];
    }
    sort(l + 1, l + n + 1);
    
    int h = 1;
    for(i = 2; i <= n; ++i)
        if(l[i] != l[h])
            l[++h] = l[i];
    
    for(i = 1; i <= n; ++i)
        v[i] = lower_bound(l + 1, l + h + 1, v[i]) - l;

    for(i = 1; i <= n; ++i){
        up[i] = query(v[i] - 1);
        d[i] = d[up[i]] + 1;
        update(v[i], i);
    }

    int best = 1;
    for(i = 2; i <= n; ++i)
        if(d[best] < d[i])
            best = i;

    printf("%d\n", d[best]);
    for(h = 0, i = best; i; i = up[i])
        l[++h] = res[i];
    while(h)
        printf("%d ", l[h--]);
    printf("\n");
    return 0;
}