import java.util.*;
/**
 * les variables sont :
 * i,j,t statiques (2 entiers, une référence)
 * le tableau de 10 entiers dans le tas (les 10 entiers, et la longueur)
 * i l'entier argument de la fonction affiche dans la pile
 * i, j les entiers arguments de la fonction f dans la pile
 * on oublie args du main et in...
 *
 * il nous faut donc
 * i, j, t, 10+1, max(1 arg,2 args), plus de quoi gérer les appels :
 * valeur de retour pour f et adresse de retour pour affiche et f
 * on doit avoir en tout au moins 18 entiers pour que ce
 * programme puisse fonctionner.
 */
public class Partiel13Ex2 {
  public static void main(String []args) {
    int ins=1;
    Scanner in = new Scanner(System.in);
    //i:0, j:1, t:2, t.length:3, t[0]...t[9]:4...13
    int []mem = new int[18];
    mem[2] = 4; // début tableau
    mem[mem[2]-1] = 10; // length = 10
    int pile = 14; // statique:0..2; tas:3..13, pile:14..17
    while (true) {
      switch(ins) {
      case 1: // i = nextInt();
        mem[0] = in.nextInt();
        ins++; break;
      case 2: // affiche(i);
        mem[pile++] = 3; // push AR
        mem[pile++] = mem[0]; // push i
        ins = 100; // call affiche()
        break;
      case 3: // for()
        mem[0] = 0; // i=0
        ins++; break;
      case 4: // if (i<t.length)
        if (mem[0]<mem[mem[2]-1]) ins++;
        else ins = 9;
        break;
      case 5: // then
        pile++; // push VR
        mem[pile++] = 6; // push AR
        mem[pile++] = 2*mem[0]; // push 2*i
        mem[pile++] = 1; // push 1
        ins = 200; // call f();
        break;
      case 6:
        mem[1] = mem[pile-1]; // j = VR de f();
        pile--; // pop VR
        ins++; break;
      case 7: // t[i] = j
        mem[mem[2]+mem[0]] = mem[1];
        ins++;
        break;
      case 8:
        mem[0]++; // i++
        ins = 4; // retour for
        break;
      case 9: // for()
        mem[0] = 0; // i = 0
        ins++;
        break;
      case 10: // if (i<t.length)
        if (mem[0]<mem[mem[2]-1]) ins++;
        else ins = 13;
        break;
      case 11: // affiche();
        mem[pile++] = 12; // push AR
        mem[pile++] = mem[mem[2]+mem[0]]; // push t[i]
        ins = 100;
        break;
      case 12:
        mem[0]++; // i++;
        ins = 10; // retour for()
        break;
      case 13:
        if (pile!=14) System.err.println("sortie avec pile non vide...");
        System.exit(1);
        break;

        /**
         * la fonction affiche ne nécessite que deux entiers sur la pile
         * l'adresse de retour et l'argument
         */
      case 100: // AR, param i
        System.out.println("J'affiche la valeur "+mem[pile-1]);
        ins++; break;
      case 101:
        pile--; // pop args
        ins = mem[pile-1]; // retrouve AR
        pile--; // pop AR
        break;

        /**
         * la fonction f nécessite quatre entiers sur la pile
         * la valeur de retour, l'adresse de retour et les deux arguments
         */
      case 200: // VR, AR, param i, param j
        mem[pile-4] = mem[pile-2]+mem[pile-1];
        ins++; break;
      case 201:
        pile -= 2; // pop args;
        ins = mem[pile-1]; // retrouve AR
        pile -= 1; // pop AR
        break;
      }
    }
  }
}