Cod sursa(job #189744)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 18 mai 2008 01:38:28
Problema Tricouri Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<stdio.h>
#define NMAX 300001

void poz(int ls,int ld,int &piv,int x[]){
int i=ls,j=ld,d=0,t;
while(i<j){
	if(x[i]<x[j]){
		t=x[i];x[i]=x[j];x[j]=t;
		d=1-d;
		}
	i+=d;
	j-=1-d;
	}
piv=i;
}

void qsrt(int st,int dr,int x[]){
int piv;
if(st<dr){
	poz(st,dr,piv,x);
	qsrt(st,piv-1,x);
	qsrt(piv+1,dr,x);
	}
}

int main(){
struct cer{int k,p;};
freopen("tricouri.in","r",stdin);
freopen("tricouri.out","w",stdout);
int v[NMAX]={0},n;
cer w[100]={{0,0}};
int m,i,j,k,up,s[6],sm=0,sa,ok;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) scanf("%d",&v[i]);
for(j=1;j<=m;j++) scanf("%d%d",&w[j].k,&w[j].p);
qsrt(1,n,v);
for(j=1;j<=m;j++){
	sm=0;ok=0;
	k=1;s[k]=0;
	while(k){
		up=0;
		while(!up&&s[k]<n){
			s[k]++;
			up=1;
			//if(sa<=w[j].p) up++;
			}
		if(up)
			if(k==w[j].k){
				sa=0;
				for(i=1;i<=k;i++) sa+=v[s[i]];
				if(sa%w[j].p==0) {
					ok=1;
					if(sm<sa) sm=sa;
					if(sm>3*sa) break;
					}
				}
			else {k++;s[k]=s[k-1];}
		else k--;
		}
	if(ok) printf("%d\n",sm);
	else printf("-1\n");
	}
return 0;
}