Cod sursa(job #1149743)

Utilizator DanielRusuDaniel Rusu DanielRusu Data 22 martie 2014 11:08:00
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>

using namespace std;

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

int i, n, poz[100001], r, in, sf, j, coada[100001];

struct numere {
   int val, nxt, lg;
};

numere v[100001];

int CB(int in, int sf, int nr);

int main() {
    FILE *fin  = fopen("scmax.in","r");
    FILE *fout = fopen("scmax.out","w");

    fscanf(fin, "%d", &n);

    for(i = 1;i <= n;i++) {
        fscanf(fin, "%d", &v[i].val);
    }

    in = 1;
    sf = 0;

    for(i = n;i >= 1;i--) {
        r = CB(in, sf, v[i].val);

        if(r == -1) {
            r = 1;
            poz[r] = i;
        }
        else {

            while(v[poz[r]].val > v[i].val) {
                r++;
            }

            if(v[poz[r]].val < v[i].val) {
                poz[r] = i;
            }
        }
        v[i].lg = r;
        v[i].nxt = poz[r - 1];

        ++sf;

        while(poz[sf] != 0) sf++;

        --sf;
    }

    coada[0] = 0;

    i = poz[sf];
    j = 1;

    while(j <= sf) {
        coada[++coada[0]] = v[i].val;

        j++;
        i = v[i].nxt;

        if(coada[0] > 1 && coada[coada[0]] <= coada[coada[0] - 1]) coada[0]--;
    }

    fprintf(fout, "%d\n", coada[0]);

    for(i = 1;i <= coada[0];i++) {
        fprintf(fout, "%d ", coada[i]);
    }

    fclose(fin);
    fclose(fout);

    return 0;

}

int CB(int in, int sf, int nr) {
    if(in > sf) return -1;
    if(sf - in <= 1) return sf;

    int mij;

    mij = (in + sf) / 2;

    if(v[poz[mij]].val > nr) {
        return CB(mij, sf, nr);
    }
    else {
        if(v[poz[mij]].val < nr) {
            return CB(in, mij, nr);
        }
        else return mij;
    }
}