#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define MAX_N 2048
#define MAX_LIST 4000005
#define FIN "eprubeta.in"
#define FOUT "eprubeta.out"
#define SQRT 45
#define NIL 0
int val[2][MAX_LIST], next[2][MAX_LIST], list_idx, L[MAX_N], R[MAX_N];
int N, M, A, B, Z, V[MAX_N], C[MAX_N];
inline int find(int L, int idx)
{
int p;
for (p = L; idx >= SQRT; idx -= SQRT, p = next[1][p]);
for (; idx > 0; --idx, p = next[0][p]);
return p;
}
inline void update(int &L, int end)
{
int p, cnt = SQRT;
val[1][L] = 0;
for (p = L; p != NIL && cnt; --cnt, p = next[0][p])
val[1][L] += val[0][p];
next[1][L] = p;
for (p = L; p != end; p = next[0][p])
{
next[1][next[0][p]] = next[0][next[1][p]];
val[1][next[0][p]] = val[1][p]-val[0][p]+val[0][next[1][p]];
}
}
void make_list(int a, int b, int &L)
{
int i, p;
if (a >= b) return;
for (i = b-1; i >= a; --i)
{
p = ++list_idx;
val[0][p] = C[i];
val[1][p] = 0;
next[0][p] = L;
next[1][p] = NIL;
L = p;
}
update(L, NIL);
}
inline void rotate(int &L1, int &L2, int size)
{
int p1, q1, p2, q2;
if (size <= 0) return;
p1 = find(L1, size-1);
q1 = find(L1, size-SQRT);
p2 = find(L2, size-1);
q2 = find(L2, size-SQRT);
swap(next[0][p1], next[0][p2]);
swap(L1, L2);
update(q1, p1);
update(q2, p2);
}
inline int get_sum(int L, int idx)
{
int p, sum = 0;
for (p = L; idx >= SQRT; idx -= SQRT, p = next[1][p])
sum = val[1][p];
for (; idx > 0; --idx, p = next[0][p])
sum += val[0][p];
return sum;
}
int main(void)
{
int i, j, k, x;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d %d %d %d %d", &N, &M, &Z, &A, &B);
for (i = 0; i < N; ++i)
{
for (j = 0; j < N; ++j)
{
C[j] = ((i+A)*(j+B)/4) % Z;
if (j == i) V[i] = C[j];
}
reverse(C, C+i);
make_list(0, i, L[i]);
make_list(i+1, N, R[i]);
}
for (; M; --M)
{
scanf("%d %d %d", &x, &i, &j);
if (x == 1)
{
for (x = k = j-i; i <= j; ++i, --j, --k)
{
rotate(L[j], R[i], k);
if (i != j) rotate(L[i], R[j], x-k);
swap(V[i], V[j]);
}
}
else
{
int sum = 0;
for (x = k = j-i; i <= j; ++i, --k)
{
sum += get_sum(L[i], x-k);
sum += get_sum(R[i], k);
sum += V[i];
}
printf("%d\n", sum);
}
}
unsigned total_sum = 0;
for (i = 0; i < N; ++i)
{
x = V[i]+get_sum(L[i], i)+get_sum(R[i], N-1-i);
total_sum += (unsigned)x*(unsigned)x*(unsigned)(i+1);
}
printf("%u\n", total_sum);
return 0;
}