Cod sursa(job #3362853)

Utilizator horia.boeriuBoeriu Horia Andrei horia.boeriu Data 12 august 2026 16:46:53
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <bits/stdc++.h>

using namespace std;
const int MAXN = 100000;
int v[MAXN + 1], aib[MAXN + 1], prec[MAXN + 1], vo[MAXN + 1], aibpoz[MAXN + 1], dp[MAXN + 1], vrez[MAXN];
struct nume {
    int val, poz;
} v2[MAXN];
int xn;

char cmp(nume a, nume b) {
    return a.val < b.val;
}
void addBit(int poz, int x, int p) {
    while (poz <= xn) {
        if (x > aib[poz]) {
            aib[poz] = x;
            aibpoz[poz] = p;
        }
        poz += (poz & (-poz));
    }
}
int maxBit(int poz) {
    int rez, p;
    rez = p = 0;
    while (poz > 0) {
        if (aib[poz] > rez) {
            rez = aib[poz];
            p = aibpoz[poz];
        }
        poz &= (poz - 1);
    }
    return p;
}
int main()
{
    FILE *fin, *fout;
    int n, i, nr, poz;
    fin = fopen("scmax.in", "r");
    fscanf(fin, "%d", &n);
    for (i = 1; i <= n; i++) {
        fscanf(fin, "%d", &vo[i]);
        v2[i - 1].val = vo[i];
        v2[i - 1].poz = i;
    }
    fclose(fin);
    //normalizez
    sort(v2, v2 + n, cmp);
    v[v2[0].poz] = xn = 1;
    for (i = 1; i < n; i++) {
        if (v2[i].val > v2[i - 1].val) {
            xn++;
        }
        v[v2[i].poz] = xn;
    }
    nr = poz = 0;
    for (i = 1; i <= n; i++) {
        prec[i] = maxBit(v[i] - 1);
        dp[i] = dp[prec[i]] + 1;
        addBit(v[i], dp[i], i);
        if (dp[i] > nr) {
            nr = dp[i];
            poz = i;
        }
    }
    nr = 0;
    while (poz > 0) {
        vrez[nr] = vo[poz];
        nr++;
        poz = prec[poz];
    }
    fout = fopen("scmax.out", "w");
    fprintf(fout, "%d\n", nr);
    for (i = nr - 1; i >= 0; i--) {
        fprintf(fout, "%d ", vrez[i]);
    }
    fprintf(fout, "\n");
    fclose(fout);
    return 0;
}