Para medir a memória utilizada no primeiro projecto, no caso de C ou C++, podemos utilizar o valgrind, em particular a ferramenta massif. Tal como indicado na documentação, para visualizar os resultados podemos utilizar o "ms_print" ou massif-visualizer. No caso de Java podemos utilizar por exemplo a ferramenta VisualVM.

O tempo de processamento do input pode representar uma fracção considerável do tempo total, de um algoritmo eficiente, que resolva o primeiro projecto. Nesse sentido não é recomendado utilizar funções ou métodos que criem muitos objectos e que demorem muito tempo.

Em particular em C++ não é recomendado utilizar '<<' ou '>>'.

Em Java é recomendado utilizar BufferedReader e BufferedWriter. A documentação do java explica estas classes, 

http://docs.oracle.com/javase/7/docs/api/java/io/BufferedWriter.html
http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html

O seguinte exemplo illustra parte da sua possivel utilização:

Para o Reader

        StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        st.parseNumbers();

        try{
            st.nextToken();
            v = (int) st.nval;
            st.nextToken();
            e = (int) st.nval;
            st.nextToken();
            s = (int) st.nval;
} ...


Para o Writter

  BufferedWriter log = new BufferedWriter(new OutputStreamWriter(System.out));
  char out[] = new char[30];
  int j;
  int tmp;

  out[29] = '\n';

  i = 1;  /* Init */
  while(i <= M)
      {
          tmp = Q[i];
          j = 28;
          while(tmp > 0)
              {
                  out[j] = (char)((int)'0' + (tmp % 10));
                  tmp = tmp/10;
                  j--;
              }
          log.write(out, j+1, 29-j);
          i++;
      }
  log.flush();