Cod sursa(job #2637258)

Utilizator euyoTukanul euyo Data 22 iulie 2020 07:29:44
Problema Subsir crescator maximal Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.26 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

const int MaxN = 100001;

struct seg {
  int d, src;
};
 
seg tree[4 * MaxN];
int v[MaxN], ind[MaxN], k[MaxN], sol[MaxN];

static inline int lSon( int node ) {
  return (node << 1);
}
static inline int rSon( int node ) {
  return (node << 1) + 1;
}
void update( int node, int st, int dr, int i, int val, int s ) {
  int mij = (st + dr) / 2;

  if ( st == dr ) {
	tree[node].d = val;
	tree[node].src = s;
    return;
  }
  if ( i <= mij ) {
	update( lSon( node ), st, mij, i, val, s );
  } else {
	update( rSon( node ), mij + 1, dr, i, val, s );
  }
  if ( tree[lSon( node )].d > tree[rSon( node )].d ) {
    tree[node].d = tree[lSon( node )].d;
    tree[node].src = tree[lSon( node )].src; 
  } else {
    tree[node].d = tree[rSon( node )].d;
    tree[node].src = tree[rSon( node )].src;
  }
}

int qi;

int query( int node, int st, int dr, int x, int y ) {
  int l = 0, r = 0, mij = (st + dr) / 2;

  if ( x <= st && dr <= y ) {
	return tree[node].d;
  }
  if ( x <= mij ) {
    l = query( lSon( node ), st, mij, x, y );
  }
  if ( y > mij ) {
    r = query( rSon( node ), mij + 1, dr, x, y );
  }
  if ( l > r ) {
	qi = tree[lSon( node )].src; 
	return l;
  } else {
	qi = tree[rSon( node )].src;
    return r;
  }
}

int cmp( int a, int b ) {
  return v[a] < v[b];
}

int main() {
  int n, i, nr, st, dr, node, j;
  
  fin >> n;
  for ( i = 1; i <= n; ++i ) {
    fin >> v[i];
	ind[i] = i;
  }
  sort( ind + 1, ind + n + 1, cmp );
  for ( i = 1; i <= n; ++i ) {
    qi = 0;
	nr = query( 1, 1, n, 1, ind[i] ) + 1;
	k[ind[i]] = tree[1].src;
	update( 1, 1, n, ind[i], nr, ind[i] );
    //printf( "              %d\n", tree[1].src );
	//printf( "           %d      %d\n", tree[2].src, tree[3].src );
	//printf( "         %d    %d %d    %d\n", tree[4].src, tree[5].src, tree[6].src, tree[7].src );
	//printf( "       %d  %d\n", tree[8].src, tree[9].src );
	//printf( "\n\n" );
  } 
  /*for ( i = 1; i <= n; ++i ) {
	//printf( "%d %d\n", k[ind[i]], v[ind[i]] );
  }*/
  fout << tree[1].d << "\n";
  i = tree[1].src;
  j = 0;
  while ( i != 0 ) {
	sol[j++] = v[i];
	i = k[i];
  }
  for ( i = tree[1].d - 1; i >= 0; --i ) {
	fout << sol[i] << " ";
  }
  fin.close();
  fout.close();
  return 0;
}