#include <bits/stdc++.h>
using namespace std;
int p[100];
long long u, v;
int MOD;
void addmod(int &x, int y) { x = (x + y) % MOD; }
int dfs(long long minx, long long maxx, long long left, long long right,
        long long state, int step) {
  if (left <= minx && maxx <= right) {
    int ret = 0;
    long long r = (v >= state) ? ((v - state) >> step) : -1;
    long long l = (u - 1 >= state) ? ((u - 1 - state) >> step) : -1;
    if (r < 0LL) return 0;
    long long a = l + r + 1, b = r - l;
    if (a & 1)
      b >>= 1;
    else
      a >>= 1;
    ret = a % MOD * (b % MOD) % MOD;
    ret = (long long)ret * p[step] % MOD;
    addmod(ret, (r - l) % MOD * (state % MOD) % MOD);
    addmod(ret, (r - l) % MOD);
    return ret;
  }
  long long mid = (minx + maxx) / 2;
  int ret = 0;
  if (left <= mid) addmod(ret, dfs(minx, mid, left, right, state, step + 1));
  if (right > mid)
    addmod(ret,
           dfs(mid + 1, maxx, left, right, state | (1LL << step), step + 1));
  return ret;
}
int main() {
  long long n, l, r;
  int m;
  scanf("%I64d%d%d", &n, &m, &MOD);
  p[0] = 1 % MOD;
  for (int i = 1; i <= 90; ++i) {
    p[i] = (p[i - 1] * 2) % MOD;
  }
  for (int i = 0; i < m; ++i) {
    scanf("%I64d%I64d%I64d%I64d", &l, &r, &u, &v);
    u = max(0LL, u - 1);
    v = min(n - 1, v - 1);
    if (u > v)
      puts("0");
    else
      printf("%d\n", dfs(0, n - 1, l - 1, r - 1, 0, 0));
  }
  return 0;
}
