#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;   }   