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();