Cod sursa(job #2090306)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 17 decembrie 2017 21:11:35
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>
#define MAXN 100000

int v[1 + MAXN];
int d[1 + MAXN], prev[1 + MAXN];
int w[1 + MAXN], num;
FILE*fi,*fo;

inline int src(int val){
    if(num == 0) return 0;
    if(val > v[w[num]]) return num;
    if(val <= v[w[1]]) return 0;

    int st = 1, dr = num;
    while(dr - st > 1){
        int m = (st + dr) / 2;
        if(v[w[m]] >= val) dr = m - 1;
        else st = m;
    }
    if(v[w[dr]] < val) return dr;
    else return st;
}

void print(int ind){
    if(prev[ind] > 0) print(prev[ind]);
    fprintf(fo,"%d ", v[ind]);
}

int main(){
    fi=fopen("scmax.in","r");
    fo=fopen("scmax.out","w");

    int n;
    fscanf(fi,"%d", &n);
    for(int i = 1; i <= n; i++)
        fscanf(fi,"%d", &v[i]);

    d[1] = 1;
    w[0] = 0;
    w[1] = 1;
    num = 1;

    for(int i = 2; i <= n; i++){
        int pos = src(v[i]);
        prev[i] = w[pos];
        d[i] = pos + 1;
        w[pos + 1] = i;
        if(num < pos + 1) num = pos + 1;
    }

    int max = -1, nmax;
    for(int i = 1; i <= n; i++)
        if(d[i] > max){
            max = d[i];
            nmax = i;
        }
    fprintf(fo,"%d\n", max);
    print(nmax);
    fclose(fi);
    fclose(fo);
    return 0;
}