Here is the quicksort program.  Draw the "stack frame" (in other
      name, "activation record") when quicksort() calls itself three times.
      Assuming you don't have to trace into "partition" function.
      
      Inside the activation record contains: local variables, frame pointer,
      stack pointer.  Show values of all of them in each AR.
// quicksort
        
        var N = 20, a
        
        to inita()
          for i 0 N-1
            a[i] = N - i
        
        to swap(i j)
          t = a[i]
          a[i] = a[j]
          a[j] = t
        
        to partition(p r)
          x = a[p]
          i = p - 1
          j = r + 1
          flag = 1
          while flag
            j = j - 1
            while a[j] > x
              j = j - 1
            i = i + 1
            while a[i] < x
              i = i + 1
            if (i < j) swap i j else flag = 0
          return j
        
        to quicksort(p r)
          if p < r
            q = partition p r
            quicksort p q
            quicksort q+1 r
        
        to main()
          a = array N
          inita 
          quicksort 0 (N - 1) 
      
//  end