#include <bits/stdc++.h>
using namespace std;
long long n;
int m, mod;
long long l, r, u, v;
inline long long up(long long a, long long b) { return a / b + (a % b > 0); }
int get(long long tl, long long tr, long long l, long long r, long long x,
        long long dx) {
  if (l >= r) return 0;
  if (l == tl && r == tr) {
    long long k1 = max(0ll, up(u - x, dx));
    long long k2 = min(r - l - 1, (v - x) / dx);
    if (v < x) return 0;
    if (k1 > r - l - 1) return 0;
    if (x + k1 * dx > v || x + k2 * dx < u || k1 > k2) return 0;
    int cnt = (k2 - k1 + 1) % mod;
    dx %= mod;
    k1 %= mod;
    x += dx * k1;
    x %= mod;
    int res = cnt * 1ll * x % mod;
    int tmp = (cnt & 1) ? ((cnt - 1) / 2 % mod * 1ll * cnt % mod)
                        : (cnt / 2 % mod * 1ll * (cnt - 1) % mod);
    tmp = tmp * 1ll * dx % mod;
    res += tmp;
    if (res >= mod) res -= mod;
    return res;
  }
  long long tm = (tl + tr + 1) >> 1;
  return (get(tl, tm, l, min(r, tm), x, 2 * dx) +
          get(tm, tr, max(l, tm), r, x + dx, 2 * dx)) %
         mod;
}
int main() {
  scanf("%lld%d%d", &n, &m, &mod);
  for (int i = 0; i < m; ++i) {
    scanf("%lld%lld%lld%lld", &l, &r, &u, &v);
    printf("%d\n", get(1, n + 1, l, r + 1, 1, 1));
  }
  return 0;
}
