#include <algorithm>
#include <fstream>
using namespace std;
ifstream fin("tricouri.in");
ofstream fout("tricouri.out");
const int kmax= 5, pmax= 20;
const int nmax= 300000, xmax= kmax*pmax;
int d[pmax+1][kmax+1], x[xmax+1], v[nmax+1], ch[pmax+1];
void clear( ) {
for ( int i= 0; i<=pmax; ++i ) {
for ( int j= 0; j<=kmax; ++j ) {
d[i][j]= -1;
}
}
for ( int i= 0; i<=pmax; ch[i]= 0, ++i ) ;
d[0][0]= 0;
}
int main( ) {
int n, m;
fin>>n>>m;
for ( int i= 1; i<=n; ++i ) {
fin>>v[i];
}
sort( v+1, v+n+1 ) ;
for ( clear(); m; --m, clear() ) {
int k, p, nr= 0;
fin>>k>>p;
for ( int i= n; i>=1; --i ) {
if ( ch[v[i]%p]<=k-1 ) {
++ch[v[i]%p];
x[++nr]= v[i];
}
}
for ( int l= 1; l<=nr; ++l ) {
for ( int i= 0; i<=p-1; ++i ) {
for ( int j= k-1; j>=0; --j ) {
if ( d[i][j]>=0 ) {
d[(i+x[l])%p][j+1]= max(d[(i+x[l])%p][j+1], d[i][j]+x[l]);
}
}
}
}
fout<<d[0][k]<<"\n";
}
return 0;
}