#include <bits/stdc++.h>
using namespace std;
unsigned long long N;
int m, mod;
unsigned long long l, r, u, v;
unsigned long long ans;
void dfs(unsigned long long l1, unsigned long long r1, unsigned long long n,
         unsigned long long l, unsigned long long r, unsigned long long u,
         unsigned long long v, int k) {
  if (l1 == l && r1 == r) {
    if (n >= u) {
      if (n <= v) {
        unsigned long long N = (v - n) / (1ll << k);
        unsigned long long a = n + (r1 - l1) * (1ll << k);
        if (a < n + N * (1ll << k)) {
          N = r1 - l1;
        }
        unsigned long long x = n + n + N * (1ll << k);
        unsigned long long y = N + 1;
        if (x & 1)
          y >>= 1;
        else
          x >>= 1;
        x %= mod;
        y %= mod;
        ans = (ans + x * y % mod) % mod;
      }
    } else {
      if (u > n + (r1 - l1) * (1ll << k)) return;
      if (n <= v) {
        unsigned long long N1 = (u - n) / (1ll << k) + 1;
        if ((u - n) % (1ll << k) == 0) N1--;
        if (v < n + N1 * (1ll << k)) return;
        unsigned long long N2 = (v - n) / (1ll << k);
        if (N2 >= r1 - l1 + 1) N2 = r1 - l1;
        if (N2 >= N1) {
          unsigned long long x = (n + N1 * (1ll << k) + n + N2 * (1ll << k));
          unsigned long long y = N2 - N1 + 1;
          if (x & 1)
            y >>= 1;
          else
            x >>= 1;
          x %= mod;
          y %= mod;
          ans = (ans + x * y % mod) % mod;
        }
      }
    }
    return;
  }
  unsigned long long mid = (l1 + r1) >> 1;
  if (mid >= r) {
    dfs(l1, mid, n, l, r, u, v, k + 1);
  } else if (mid < l) {
    dfs(mid + 1, r1, n + (1ll << k), l, r, u, v, k + 1);
  } else {
    dfs(l1, mid, n, l, mid, u, v, k + 1);
    dfs(mid + 1, r1, n + (1ll << k), mid + 1, r, u, v, k + 1);
  }
}
int main() {
  cin >> N >> m >> mod;
  for (int i = 0; i < m; i++) {
    ans = 0;
    cin >> l >> r >> u >> v;
    dfs(1, N, 1, l, r, u, v, 0);
    cout << ans << endl;
  }
  return 0;
}
