Cod sursa(job #2908253)

Utilizator ClaudiuChelceaClaudiuChelcea ClaudiuChelcea Data 2 iunie 2022 13:03:04
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>
 
#define MAX_N 100010
 
int n,m,i,j,k,poz,p,q,max;
int a[MAX_N],st[MAX_N],d[MAX_N];
 
int caut(int x) {
    p = 0; q = m + 1;
    int sol = 0,r = 0;
    while (p + 1 < q) {
          r = (p + q) / 2;
          if (st[r] >= a[i]) sol = q = r;
          else if (st[r] < a[i])
                 p = r;
    }
    return sol;
}
 
void afis(int poz, int val) {
    if (val == 0) return;
    for (int i = poz - 1; i >= 1; i--)
        if (d[i] == val && a[i] < a[poz]) {
            afis(i, val - 1);
            printf("%d ",a[i]);
            break;
        }
}
 
int main() {
 
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    
    scanf("%d",&n);
    for (i = 1; i <= n; i++)
        scanf("%d",&a[i]);
        
    for (i = 1; i <= n; i++) {
        poz = caut(a[i]);
        if (!poz) poz = ++m;
        st[poz] = a[i];
        d[i] = poz;
    }
    
    for (i = 1; i <= n; i++)
        if (d[i] > max) {
            max = d[i];
            p = i;
    }
    printf("%d\n",max);
 
    a[n + 1] = a[p] + 1;
    afis(n + 1,max);
    printf("\n");
 
    return 0;
}