不停的分治下去就好了,
更容易想到的是
求出(1,r,u,v)-(1,l-1,u,v)
#include <cstdio>
typedef long long LL;
int Mod;
LL u,v;
int calc(LL a,LL d,LL n,LL l,LL r){
if (v<a || u>a+d*(n-1)) return 0;
if (l==1 && r==n){
if (u<=a) l=1; else l=(u-a-1)/d+2;
if (v>=a+d*(n-1)) r=n; else r=(v-a)/d+1;
LL x=a*2+(l+r-2)*d, y=r-l+1;
if (x&1) y>>=1; else x>>=1;
return x%Mod*(y%Mod)%Mod;
}
LL mid=(n+1)>>1;
if (r<=mid) return calc(a,d<<1,mid,l,r);
if (l>mid) return calc(a+d,d<<1,n-mid,l-mid,r-mid);
return (calc(a,d<<1,mid,l,mid)+calc(a+d,d<<1,n-mid,1,r-mid))%Mod;
}
int main(){
int m;
LL n,l,r;
scanf("%I64d%d%d",&n,&m,&Mod);
while (m--){
scanf("%I64d%I64d%I64d%I64d",&l,&r,&u,&v);
printf("%d\n",calc(1,1,n,l,r));
}
return 0;
}