Cod sursa(job #2511232)

Utilizator ililogIlinca ililog Data 18 decembrie 2019 16:30:25
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
using namespace std;
#include<iostream>
#include<fstream>

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


int n, v[100003], best[100003], p[100003], maxim, k, L[100003], nr, poz;

int caut(int x) {
   int st, dr, mid;
   st = 0; dr = nr;
   while (st <= dr) {
        mid = (st+dr)/2;
        if (v[L[mid]] < x && v[L[mid+1]] >= x) {
            return mid;
        } else if (v[L[mid+1]] < x) {
            st = mid + 1;
        } else {
            dr = mid - 1;
        }
   }
   return nr;
}

void afis(int i) {
   if (p[i] > 0) {
        afis(p[i]);
   }
    fout << v[i] << " ";
}

int main() {


    fin >> n;

    for (int i = 1; i <= n; i++) {
        fin >> v[i];
        best[1] = L[1] = 1;
        L[0] =  0;
    }

    for (int i = 2; i <= n; i++) {
      poz = caut(v[i]);
      p[i] = L[poz];
      best[i] = poz + 1;
     // cout << best[i] << " ";
      L[poz + 1] = i;
      if (nr < poz + 1) {
        nr = poz + 1;
      }
   }

    maxim = 0; poz = 0;
    for (int i = 1; i <= n; i++) {
        if (maxim < best[i]) {
          maxim = best[i];
           poz = i;
       }
    }

    fout << maxim << endl;
    afis(poz);




   /* for (int i = 2; i<=n; i++) {
        for (int j = 1; j<i; j++) {
            if (v[j] < v[i]) {
                t[i] = max(t[j]+1, t[i]);
            }
        }
        if (t[i] > submax) {
            submax = t[i];
        }
    }

    for (int i = 1; i<=n; i++) {
        cout << t[i] << " ";
    }

    fout << submax;*/

    fin.close();
    fout.close();

    return 0;
}