Esempio n. 1
0
int main ()
{
  freopen ("subseq.in", "rt", stdin);
  freopen ("subseq.out", "wt", stdout);

  scanf ("%d", &n);

  for (int i = 0; i < n; i++)
  {
    scanf ("%d", &seq[i]);
    ps[i] = make_pair (-seq[i], -i);
  }
  sort (ps, ps + n);
  for (int i = 0; i < n; i++)
    tg[-ps[i].second] = i;

  t.build ();

  for (int i = 0; i < n; i++)
  {
    int r = t.get (0, tg[i]);
    if (r < 0)
      t.set (tg[i], 1), prev[i] = -1;
    else
      t.set (tg[i], t.v[r] + 1), prev[i] = -ps[r].second;
  }

  int mv = 0, mi = -1;
  for (int i = 0; i < n; i++)
    if (t.v[tg[i]] > mv)
      mv = t.v[tg[i]], mi = i;

  int ml = 0;
  int cur = mi;
  while (cur >= 0)
    seq[ml++] = cur, cur = prev[cur];
  sort (seq, seq + ml);
  printf ("%d\n", ml);
  for (int i = 0; i < ml; i++)
    printf ("%d ", seq[i] + 1);

  return 0;
}
Esempio n. 2
0
#include "testhelpers.h"

#include <stdio.h>

using namespace libbruce;

TEST_CASE("reading from a tree", "[query]")
{
    be::mem mem(1024);
    tree<int, int> t(maybe_nodeid(), mem);
    t.insert(1, 1);
    t.insert(2, 2);
    mutation mut = t.write();

    tree<int, int> q(*mut.newRootID(), mem);
    REQUIRE( *q.get(1) == 1 );
    REQUIRE( *q.get(2) == 2 );
    REQUIRE( !q.get(3) );
}

TEST_CASE("reading from a tree with queued insert", "[query]")
{
    be::mem mem(1024);
    tree<int, int> t(maybe_nodeid(), mem);
    t.insert(0, 0);
    mutation mut = t.write();

    tree<int, int> q(*mut.newRootID(), mem);
    q.insert(1, 1);
    REQUIRE( *q.get(1) == 1 );
}