#include<bits/stdc++.h>
using namespace std;
const int N=30005;
int inline read()
{
int num=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
return num*f;
}
int n,m,tot,mod,siz,bel[N],a[N],c[N];
int L=1,R,cnt[N],ans[N];
struct data{int l,r,id;}d[N];
bool operator <(data A,data B){return bel[A.l]==bel[B.l]?(bel[A.l]&1?A.r<B.r:A.r>B.r):A.l<B.l;}
int inc(int x,int y){return x+y>=mod?x+y-mod:x+y;}
struct Matrix
{
int M[4];
Matrix(){memset(M,0,sizeof(M));}
void reset(){M[0]=1;M[1]=0;M[2]=0;M[3]=1;}
int &operator [](const int x){return M[x];}
Matrix friend operator +(Matrix A,Matrix B)
{
Matrix res;
res[0]=inc(A[0],B[0]);
res[1]=inc(A[1],B[1]);
res[2]=inc(A[2],B[2]);
res[3]=inc(A[3],B[3]);
return res;
}
Matrix friend operator *(Matrix A,Matrix B)
{
Matrix res;
res[0]=(1ll*A[0]*B[0]+1ll*A[1]*B[2])%mod;
res[1]=(1ll*A[0]*B[1]+1ll*A[1]*B[3])%mod;
res[2]=(1ll*A[2]*B[0]+1ll*A[3]*B[2])%mod;
res[3]=(1ll*A[2]*B[1]+1ll*A[3]*B[3])%mod;
return res;
}
Matrix friend operator *(Matrix a,int x)
{
if(x==1)return a;
a[0]=(1ll*a[0]*x)%mod;
a[1]=(1ll*a[1]*x)%mod;
a[2]=(1ll*a[2]*x)%mod;
a[3]=(1ll*a[3]*x)%mod;
return a;
}
}fib[N],inv[N];
int w[N<<2],tag[N<<2];Matrix t[N<<2];
#define ls (k<<1)
#define rs (k<<1|1)
#define mid (l+r>>1)
void up(int k)
{
Matrix A=t[ls],B=t[rs];
if(w[ls]!=1)A=A*w[ls];
if(w[rs]!=1)B=B*w[rs];
t[k]=A+B;
}
void up(int k){t[k]=(t[ls]*w[ls])+(t[rs]*w[rs]);}
void LT(int k,int v){if(v>0)t[k]=t[k]*fib[v];else t[k]=t[k]*inv[-v];tag[k]+=v;}
void down(int k){if(tag[k])LT(ls,tag[k]),LT(rs,tag[k]),tag[k]=0;}
void insert(int k,int l,int r,int q)
{
if(l==r)return w[k]=c[q],void();
down(k);
if(q<=mid)insert(ls,l,mid,q),LT(rs,1);
else insert(rs,mid+1,r,q);
up(k);
}
void erase(int k,int l,int r,int q)
{
if(l==r)return w[k]=0,void();
down(k);
if(q<=mid)erase(ls,l,mid,q),LT(rs,-1);
else erase(rs,mid+1,r,q);
up(k);
}
void add(int x){if(!cnt[x])insert(1,1,tot,x);cnt[x]++;}
void del(int x){cnt[x]--;if(!cnt[x])erase(1,1,tot,x);}
int main(){
n=read();mod=read();
for(int i=1;i<=n;i++)c[i]=a[i]=read();
sort(c+1,c+1+n);tot=unique(c+1,c+1+n)-c-1;
for(int i=1;i<=n;i++)a[i]=lower_bound(c+1,c+1+tot,a[i])-c;
fib[1][0]=1;fib[1][1]=1;fib[1][2]=1;fib[1][3]=0;
inv[1][0]=0;inv[1][1]=1;inv[1][2]=1;inv[1][3]=mod-1;
for(int i=2;i<=tot;i++)
{
fib[i]=fib[1]*fib[i-1];
inv[i]=inv[1]*inv[i-1];
}
m=read();siz=ceil(n/sqrt(m));
for(int i=1;i<=m;i++)d[i]=(data){read(),read(),i};
for(int i=1;i<=n;i++)bel[i]=(i-1)/siz+1;
sort(d+1,d+1+m);
build(1,1,tot);
for(int i=1;i<=m;i++)
{
while(L>d[i].l)add(a[--L]);
while(R<d[i].r)add(a[++R]);
while(L<d[i].l)del(a[L++]);
while(R>d[i].r)del(a[R--]);
ans[d[i].id]=t[1][2];
}
for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
return 0;
}