Cod sursa(job #189764)
#include<stdio.h>
#define NMAX 300000
int v[NMAX]={0},n;
void poz(int ls,int ld,int &piv){
int i=ls,j=ld,d=0,t;
while(i<j){
if(v[i]<v[j]){
t=v[i];v[i]=v[j];v[j]=t;
d=1-d;
}
i+=d;
j-=1-d;
}
piv=i;
}
void qsrt(int st,int dr){
int piv;
if(st<dr){
poz(st,dr,piv);
qsrt(st,piv-1);
qsrt(piv+1,dr);
}
}
int main(){
struct cer{int k,p;};
freopen("tricouri.in","r",stdin);
freopen("tricouri.out","w",stdout);
cer w[100]={{0,0}};
int m,i,s,ok,a,b,c,d,e,sm;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++) scanf("%d",&v[i]);
for(i=0;i<m;i++) scanf("%d%d",&w[i].k,&w[i].p);
qsrt(0,n-1);
for(i=0;i<m;i++){
s=0;ok=0;sm=0;
switch (w[i].k){
//ar trebui cautat binar
case 1:for(a=0;a<n&&!ok;a++){
sm=v[a];
if(sm==w[i].p) ok=1;
}
break;
case 2:for(a=0;a<n-1&&!ok;a++)
for(b=a+1;b<n&&!ok;b++){
s=v[a]+v[b];
if(s%w[i].p==0&&s>sm) sm=s;
if(sm>1.5*s) ok=1;
}
if(sm) ok=1;
break;
case 3:for(a=0;a<n-2&&!ok;a++)
for(b=a+1;b<n-1&&!ok;b++)
for(c=b+1;c<n&&!ok;c++){
s=v[a]+v[b]+v[c];
if(s%w[i].p==0&&s>sm) sm=s;
if(sm>2*s) ok=1;
}
if(sm) ok=1;
break;
case 4:for(a=0;a<n-3&&!ok;a++)
for(b=a+1;b<n-2&&!ok;b++)
for(c=b+1;c<n-1&&!ok;c++)
for(d=c+1;d<n&&!ok;d++){
s=v[a]+v[b]+v[c]+v[d];
if(s%w[i].p==0&&s>sm) sm=s;
if(sm>*3*s) ok=1;
}
if(sm) ok=1;
break;
case 5:for(a=0;a<n-4&&!ok;a++)
for(b=a+1;b<n-3&&!ok;b++)
for(c=b+1;c<n-2&&!ok;c++)
for(d=c+1;d<n-1&&!ok;d++)
for(e=d+1;e<n&&!ok;e++){
s=v[a]+v[b]+v[c]+v[d]+v[e];
if(s%w[i].p==0&&s>sm) sm=s;
if(sm>2.5*s) ok=1;
}
if(sm) ok=1;
break;
}
if(ok) printf("%d\n",sm);
else printf("-1\n");
}
return 0;
}