Pagini recente » Cod sursa (job #164058) | Cod sursa (job #1321535) | Cod sursa (job #1371244) | Cod sursa (job #178536) | Cod sursa (job #189985)
Cod sursa(job #189985)
#include<stdio.h>
#define NMAX 300000
int v[NMAX]={0},n;
int uu[6][21]={{0}};
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++)
{
if(uu[w[i].k][w[i].p]!=0) continue;
else
{
s=0;ok=0;sm=0;
switch (w[i].k){
//ar trebui cautat binar
case 1:a=0;
while(v[a]%w[i].p!=0) a++;
if(a<n&&v[a]%w[i].p==0) {ok=1;sm=v[a];}
break;
case 2:if(v[0]*2<w[i].p) ;else
for(a=0;a<n-1;a++){
if(v[a]*2<=sm) break;
for(b=a+1;b<n;b++){
s=v[a]+v[b];
if(s%w[i].p==0&&s>sm) sm=s;
if(sm>=s) break;
}
}
if(sm) ok=1;
break;
case 3:if(v[0]*3<w[i].p) ;else
for(a=0;a<n-2;a++){
if(v[a]*3<=sm) break;
for(b=a+1;b<n-1;b++){
if(v[a]+2*v[b]<=sm) break;
for(c=b+1;c<n;c++){
s=v[a]+v[b]+v[c];
if(s%w[i].p==0&&s>sm) sm=s;
if(sm>=s) break;
}
}
}
if(sm) ok=1;
break;
case 4:if(v[0]*4<w[i].p) ;else
for(a=0;a<n-3;a++){
if(v[a]*4<=sm) break;
for(b=a+1;b<n-2;b++){
if(v[a]+3*v[b]<=sm) break;
for(c=b+1;c<n-1;c++){
if(v[a]+v[b]+2*v[c]<=sm) break;
for(d=c+1;d<n;d++){
s=v[a]+v[b]+v[c]+v[d];
if(s%w[i].p==0&&s>sm) sm=s;
if(sm>=s) break;
}
}
}
}
if(sm) ok=1;
break;
case 5:if(v[0]*5<w[i].p) ;else
for(a=0;a<n-4;a++){
if(v[a]*5<=sm) break;
for(b=a+1;b<n-3;b++){
if(v[a]+4*v[b]<=sm) break;
for(c=b+1;c<n-2;c++){
if(v[a]+v[b]+3*v[c]<=sm) break;
for(d=c+1;d<n-1;d++){
if(v[a]+v[b]+v[c]+2*v[d]<=sm) break;
for(e=d+1;e<n;e++){
s=v[a]+v[b]+v[c]+v[d]+v[e];
if(s%w[i].p==0&&s>sm) sm=s;
if(sm>=s) break;
}
}
}
}
}
if(sm) ok=1;
break;
}
if(ok) ;
else sm=-1;
uu[w[i].k][w[i].p]=sm;
}
printf("%d\n",uu[w[i].k][w[i].p]);
}
return 0;
}
/* if(ok) uu[w[i].k][w[i].p]=sm;
else uu[w[i].k][w[i].p]=-1;*/