Cod sursa(job #189738)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 18 mai 2008 00:23:10
Problema Tricouri Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include<stdio.h>
#define NMAX 1000

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]++;
			sa=0;
			for(i=1;i<=k;i++) sa+=v[s[i]];
			up=1;
			//if(sa<=w[j].p) up++;
			}
		if(up)
			if(k==w[j].k&&sa%w[j].p==0) {ok=1;break;}
			else if(k==w[j].k) ;
				 else {k++;s[k]=s[k-1];}
		else k--;
		}
	if(ok) printf("%d\n",sa);
	else printf("-1\n");
	}
return 0;
}