diff --git a/2024a/minibasic/semantic-2/ast.hpp b/2024a/minibasic/semantic-2/ast.hpp
index 23bb5645..15591acb 100644
--- a/2024a/minibasic/semantic-2/ast.hpp
+++ b/2024a/minibasic/semantic-2/ast.hpp
@@ -7,7 +7,7 @@
 
 #include "symbol.hpp"
 
-extern std::map<char, int> global_vars;
+extern std::vector<int> rt_stack;
 
 class AST {
  public:
@@ -38,6 +38,13 @@ class Decl : public AST {
   void printAST(std::ostream &out) const override {
     out << "Decl(" << var << ": " << type << ")";
   }
+  void allocate() {
+    rt_stack.push_back(0);
+  }
+  void deallocate() {
+    rt_stack.pop_back();
+  }
+
  private:
   char var;
   Type type;
@@ -138,16 +145,18 @@ class Id : public Expr {
   void sem_analyze() override {
     STEntry *e = st.lookup(var);
     type = e->type;
+    offset = e->offset;
   }
   void printAST(std::ostream &out) const override {
     out << "Id(" << var << ")";
   }
   char getVar() { return var; }
   int evaluate() const override {
-    return global_vars[var];
+    return rt_stack[offset];
   }
  private:
   char var;
+  int  offset;
 };
 
 class Block : public Stmt {
@@ -186,8 +195,9 @@ class Block : public Stmt {
     out << ")";
   }
   void execute() const override {
-    for (Stmt *s : stmt_list)
-      s->execute();
+    for (Decl *d : decl_list) d->allocate();
+    for (Stmt *s : stmt_list) s->execute();
+    for (Decl *d : decl_list) d->deallocate();
   }
 
  private:
@@ -202,16 +212,18 @@ class Let : public Stmt {
   void sem_analyze() override {
     STEntry *lhs = st.lookup(var->getVar());
     expr->check_type(lhs->type);
+    offset = lhs->offset;
   }
   void printAST(std::ostream &out) const override {
     out << "Let(" << *var << ", " << *expr << ")";
   }
   void execute() const override {
-    global_vars[var->getVar()] = expr->evaluate();
+    rt_stack[offset] = expr->evaluate();
   }
  private:
   Id   *var;
   Expr *expr;
+  int  offset;
 };
 
 class For : public Stmt {
diff --git a/2024a/minibasic/semantic-2/parser.y b/2024a/minibasic/semantic-2/parser.y
index fa67ddf7..f9f58cc2 100644
--- a/2024a/minibasic/semantic-2/parser.y
+++ b/2024a/minibasic/semantic-2/parser.y
@@ -6,7 +6,7 @@
 
 SymbolTable st;
 
-std::map<char, int> global_vars;
+std::vector<int> rt_stack;
 %}
 
 %token T_begin "begin"
@@ -54,8 +54,8 @@ std::map<char, int> global_vars;
 
 program : block   { // std::cout << "AST: " << *$1 << std::endl;
                     $1->sem_analyze(); 
+                    $1->execute();
                     delete $1; } 
-                    // $1->execute(); } 
         ;
 
 block : decl_list stmt_list		 { $1->merge($2); $$ = $1; }
diff --git a/2024a/minibasic/semantic-2/symbol.hpp b/2024a/minibasic/semantic-2/symbol.hpp
index b78a3c60..3fbec808 100644
--- a/2024a/minibasic/semantic-2/symbol.hpp
+++ b/2024a/minibasic/semantic-2/symbol.hpp
@@ -1,31 +1,39 @@
 #ifndef __SYMBOL_HPP__
 #define __SYMBOL_HPP__
 
+#include <map>
+#include <vector>
+
 enum Type { TYPE_int, TYPE_bool };
 
 extern void yyerror(const char *msg);
 
 struct STEntry {
   Type type;
+  int  offset;
   STEntry() {}
-  STEntry(Type t) : type(t) {}
+  STEntry(Type t, int o) : type(t), offset(o) {}
 };
 
 class Scope {
  public:
-  Scope() {}
+  Scope(int o) : offset(o) {}
   void insert(char v, Type t) {
     if (locals.find(v) != locals.end())
       yyerror("Duplicate variable declaration");
-    locals[v] = STEntry(t);
+    locals[v] = STEntry(t, offset++);
   }
   STEntry *lookup(char v) {
     if (locals.find(v) == locals.end()) return nullptr;
     return &(locals[v]);
   }
+  int getOffset() {
+    return offset;
+  }
 
  private:
   std::map<char, STEntry> locals;
+  int offset;
 };
 
 class SymbolTable {
@@ -42,7 +50,8 @@ class SymbolTable {
     return nullptr;
   }
   void enterScope() {
-    scopes.push_back(Scope());
+    int o = scopes.empty() ? 0 : scopes.back().getOffset();
+    scopes.push_back(Scope(o));
   }
   void exitScope() {
     scopes.pop_back();
