Cod sursa(job #2969209)

Utilizator Robilika2007Robert Badea Robilika2007 Data 22 ianuarie 2023 18:48:47
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.11 kb
/*
#include <fstream>
#include <iostream>

using namespace std;

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

#define MAX_n 100000
int v[MAX_n], pred[MAX_n], s[MAX_n];

int cautabin (int st, int dr, int a) // 0 1 15
{
    int pas = (1 << 16), ac = st - 1;
    while(pas)
    {
        if(ac + pas <= dr)
        {
            //cout << pas << " ";
            if(v[s[ac + pas]] < a)
            {
                ac += pas;
            }
        }
        pas >>= 1;
    }
    //cout << ac;
    return ac;
}

void scrie(int poz)
{
    if(poz != 1)
    {
        scrie(pred[poz]);
        fout << v[poz];
    }
}

int main()
{
    int n, ans = 0;
    fin >> n;

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

        int lung = cautabin(0, ans - 1, v[i]) + 1;
        s[lung] = i;

        s[lung] = i; // s[1] = 1

        if(lung > 0)
            pred[i] = s[lung - 1];
        else
            pred[i] = -1;

        ans = max(ans, lung + 1);
    }

    fout << ans << '\n';
    scrie(s[ans - 1]);
}
*/

#include <stdio.h>

#define MAX_N 100000

FILE *fin, *fout;
int v[MAX_N], s[MAX_N], pred[MAX_N];

inline int max(int a, int b) {
  return a > b ? a : b;
}

int binarySearch(int searchValue, int left, int right) {
  int i, step;
  i = left - 1;
  step = 1 << 16;
  while (step) {
    if (i + step <= right && v[s[i + step]] < searchValue)
      i += step;
    step >>= 1;
  }
  return i;
}

void write(int pos) {
  if (pos != -1) {
    write(pred[pos]);
    fprintf(fout, "%d ", v[pos]);
  }
}

int main() {
  int n, i, length, maxLength;

  fin = fopen("scmax.in", "r");
  fscanf(fin, "%d", &n);
  for (i = 0; i < n; ++i)
    fscanf(fin, "%d", &v[i]);
  fclose(fin);

  maxLength = 0;
  for (i = 0; i < n; ++i) {
    length = binarySearch(v[i], 0, maxLength - 1) + 1;
    s[length] = i;

    pred[i] = length > 0 ? s[length - 1] : -1;
    maxLength = max(maxLength, length + 1);
  }

  fout = fopen("scmax.out", "w");
  fprintf(fout, "%d\n", maxLength);
  write(s[maxLength - 1]);
  fclose(fout);

  return 0;
}