Cod sursa(job #2514495)

Utilizator AlexNeaguAlexandru AlexNeagu Data 26 decembrie 2019 10:11:11
Problema Subsir crescator maximal Scor 65
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <bits/stdc++.h>
using namespace std;
const int N = 100050;
ifstream in("scmax.in");
ofstream out("scmax.out");
vector < pair < int, int > > ST(N * 4 + 5, {0, 0});
vector < int > v(N), ind1(N + 5), vv(N);
int pos = 0;
map < int, int > h;
vector < int > p(N, 0), ans;
pair < int, int > mx = {-2e9, 0};
pair < int, int > MAX(pair <int, int > a, pair <int,int> b) {
  if (a.first > b.first) {
    return a;
  }
  if (b.first > a.first) {
    return b;
  }
  return a;
}
pair < int, int > query(int node, int l, int r, int st, int dr) {
  if (l >= st && r <= dr) {
    return ST[node];
  }
  if (st > r || dr < l) {
    return {0, 0};
  }
  int mid = (l + r) / 2;
  return MAX(query(node * 2, l, mid, st, dr), query(node * 2 + 1, mid + 1, r, st, dr));
}
void update(int node, int l, int r, int pos, int val) {
  if (l > pos || pos > r) {
    return;
  }
  if (l == r) {
    ST[node].first = val;
    ST[node].second = pos;
    return;
  }
  int mid = (l + r) / 2;
  update(2 * node, l, mid, pos, val);
  update(2 * node + 1, mid + 1, r, pos, val);
  ST[node] = MAX(ST[node * 2],  ST[node * 2 + 1]);
}
int main() {
  int n;
  in >> n;
  for (int i = 1; i <= n; i++) {
    in >> v[i];
    vv[i] = v[i];
  }
  sort(vv.begin() + 1, vv.begin() + 1 + n);
  for (int i = 1; i <= n; i++) {
    if (vv[i] != vv[i - 1]) {
      pos++;
      ind1[pos] = vv[i];
      h[vv[i]] = pos;
    }
  }
  for (int i = 1; i <= n; i++) {
    pair < int, int > fnd_mx = query(1, 1, n, 1, h[v[i]] - 1);
    if (fnd_mx.first + 1 > mx.first) {
      mx.first = fnd_mx.first + 1;
      mx.second = h[v[i]];
    }
    p[h[v[i]]] = fnd_mx.second;
    update(1, 1, n, h[v[i]], fnd_mx.first + 1);
  }
  out << mx.first << "\n";
  while(mx.second) {
    ans.push_back(mx.second);
    mx.second = p[mx.second];
  }
  reverse(ans.begin(), ans.end());
  for (auto it : ans) out << ind1[it] << " ";
  return 0;
}