Cod sursa(job #2608005)

Utilizator AndreosAndrei Otetea Andreos Data 30 aprilie 2020 14:19:42
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>

int n,l, v[100005], last[100005], pred[100005], sol[100005];
void print(int i)
{
    if(pred[i]>0)
        print(pred[i]);
    printf("%d ",v[i]);
}

int find(int x)
{
   int st,dr,med;
   st=1;
   dr=l;
   while (st<=dr)
   {
      med=(st+dr)>>1;
      if (v[last[med]]<x &&  v[last[med+1]] >= x)
        return med;
      if (v[last[med+1]]<x)
        st=med+1;
      else
        dr=med-1;
   }
   return l;
}

int main() {
    int i, l = 0, pos, cnt = 0;
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d", &n);
    for(i = 1; i <= n; ++i)
        scanf("%d", &v[i]);
    for(i = 1; i <= n; ++i)
        if(v[i] < v[last[1]]) {
            pred[i] = 0;
            last[1] = i;
        }
        else if(v[i] > v[last[l]]) {
            pred[i] = last[l];
            last[++l] = i;
        }
        else {
            pos = find(v[i]);
            pred[i] = last[pos];
            last[pos+1] = i;
        }

    printf("%d\n", l);
    for(i = last[l]; i != 0; i = pred[i])
        sol[++cnt] = v[i];

    for(i = cnt; i >= 1; --i)
        printf("%d ", sol[i]);
}