Problem:
Stack

Stack is a container of elements that are inserted and deleted according to LIFO (Last In First Out).

For $n$ stack $S_i$ ($i = 0, 1, ..., n-1$), perform a sequence of the following operations.

push($t$, $x$): Insert an integer $x$ to $S_t$.

top($t$): Report the value which should be deleted next from $S_t$. If $S_t$ is empty, do nothing.

pop($t$): Delete an element from $S_t$. If $S_t$ is empty, do nothing.

In the initial state, all stacks are empty.

Input

The input is given in the following format.

$n \; q$
$query_1$
$query_2$
:
$query_q$

Each query $query_i$ is given by

0 $t$ $x$

or

1 $t$

or

2 $t$

where the first digits 0, 1 and 2 represent push, top and pop operations respectively.

Output

For each top operation, print an integer in a line.

Constraints

$1 \leq n \leq 1,000$

$1 \leq q \leq 200,000$

$-1,000,000,000 \leq x \leq 1,000,000,000$

Sample Input 1

3 9
0 0 1
0 0 2
0 0 3
0 2 4
0 2 5
1 0
1 2
2 0
1 0

Sample Output 1

3
5
2

Solution in C (judge verdict: Accepted)

/*
 * FileName:     stack_model
 * CreatedDate:  2020-05-23 23:19:48 +0900
 * LastModified: 2020-05-23 23:31:24 +0900
 */

#include<stdio.h>
#include<stdlib.h>
static const int MAX_N = 1000;

typedef struct Node{
    int data;
    struct Node *under;
}node_str;
typedef struct Stack{
    node_str *top;
}stack_str;

stack_str *CreateStack(){
    stack_str *S = malloc(sizeof(stack_str));
    S->top = NULL;
    return S;
}
void push(stack_str *S, int x){
    if(S->top == NULL){
	S->top = malloc(sizeof(node_str));
	S->top->data = x;
	S->top->under = NULL;
    }else{
	node_str *bf = malloc(sizeof(node_str));
	bf->under = S->top;
	bf->data = x;
	S->top = bf;
    }
}
void top(stack_str *S){
    if(S->top == NULL) return;
    printf("%d\n", S->top->data);
}
void pop(stack_str *S){
    if(S->top == NULL) return;
    if(S->top->under == NULL){
	free(S->top);
	S->top = NULL;
	return;
    }
    node_str *bf = S->top->under;
    free(S->top);
    S->top = bf;
}
void deleteStack(stack_str *S){
    if(S->top == NULL) return;
    node_str *cur = S->top;
    for(;;){
	if(cur->under == NULL){
	    free(cur);
	    break;
        }
	node_str *bf = cur->under;
	free(cur);
	cur = bf;
    }
    free(S);
}

int main(){
    int n, q;
    scanf("%d %d", &n, &q);
    stack_str *S[MAX_N];
    for(int i = 0; i < n; i++) S[i] = CreateStack();
    for(int i = 0; i < q; i++){
	int op, t;
	scanf("%d %d", &op, &t);
	if(op == 0){
	    int x;
	    scanf("%d", &x);
	    push(S[t], x);
	}else if(op == 1){
	    top(S[t]);
	}else if(op == 2){
	    pop(S[t]);
	}
    }
    for(int i = 0; i < n; i++) deleteStack(S[i]);
    return 0;
}