Alcune considerazioni:
- la libreria math non serve;
- per questioni di maggior chiarezza e leggibilità ti consiglio di scrivere codice in modo indentato, di rispettare la spaziatura, di dare alle variabili nomi significativi (nel caso specifico al posto di p, q, s, z avresti potuto usare r1, c1, r2, c2), di scrivere una sola istruzione per riga e di racchiudere sempre il corpo (anche se costituito da una sola riga di codice) di un'istruzione di controllo (if, for, while, ...) all'interno di parentesi graffe;
- allo scopo di non avere un codice tanto ridondante potresti prevedere delle funzioni (se sai cosa sono) che si occupino dell'inserimento e della stampa di una matrice.
Piccola parentesi... gli array statici sono array la cui dimensione è determinata in fase di compilazione, quindi la loro dimensione deve essere costituita da un'espressione costante e non da una variabile. Questo significa che quelli che tu utilizzi non sono array statici, ma VLA (variable-length array), la cui dimensione è determinata in fase di esecuzione e quindi la loro dimensione sarà costituita da una variabile. Il C++ non supporta i VLA, invece il C (C99) sì... premesso che per il tuo programma non dovresti avere problemi con i VLA, va detto che in ogni caso ci sono pro e contro nel loro utilizzo, se ti interessa l'argomento fai qualche ricerca su google.
Detto questo il problema è qui:
int p=0;
int q=0;
int mat[p][q];
Stai creando una matrice di 0 righe e 0 colonne. Forse la riga "int mat[p][q]" va messa altrove.