Cod sursa(job #315745)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 17 mai 2009 00:32:22
Problema Tricouri Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.58 kb
#include<stdio.h>
#include<stdlib.h>
#define NMAX 300000

struct cer{int k,p,r,id;};
typedef cer*pcer;
cer w[100];

int v[NMAX]={0},n;

int fcmp0(void const*a,void const*b){
return *((int*)b)-*((int*)a);
}

int ma[21][21][7];

int fcmp(void const*a,void const*b){
return ((pcer)a)->p-((pcer)b)->p;
}
int fcmp2(void const*a,void const*b){
return ((pcer)a)->id-((pcer)b)->id;
}

int main(){
freopen("tricouri.in","r",stdin);
freopen("tricouri.out","w",stdout);
int m,i,j,k,s,ok,a,b,c,d,e,sm,nec,s1,s2,s3,r,nr,mai;
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);w[i].id=i;}
qsort(w,m,sizeof(w[0]),fcmp);
for(i=0;i<n;++i){
	mai=19;
	for(d=2;d<21&&mai;++d){
		r=v[i]%d;
		nr=ma[d][r][0];
		if(nr<5) {
			nr++;
			ma[d][r][nr]=v[i];
			ma[d][r][0]=nr;
			if(nr==5) mai--;
			break;
			}
		}
	}
d=0;
for(i=2;i<21;++i)
	for(j=0;j<20;++j)
		for(k=1;k<=ma[i][j][0];++k){
			v[d]=ma[i][j][k],d++;
			}
n=d;
qsort(v,n,sizeof(v[0]),fcmp0);

for(i=0;i<m;i++){
	s=0;ok=0;sm=-1;
	if(i&&w[i].k==w[i-1].k&&w[i].p==w[i-1].p) {
		w[i].r=w[i-1].r;continue;
		}
	switch (w[i].k){
	case 1:a=0;
		   while(v[a]%w[i].p!=0) a++;
		   if(a<n) sm=v[a];
		   break;
	case 2:for(a=0;a<n-1;a++){
			  nec=w[i].p-v[a]%w[i].p;
			  if(nec==w[i].p) nec=0;
			  for(b=a+1;b<n;b++){
				if(v[b]%w[i].p!=nec) continue;
				s=v[a]+v[b];
				if(s>sm) sm=s;
				else break;
				}
		   }
		   break;
	case 3:for(a=0;a<n-2;a++){
			  for(b=a+1;b<n-1;b++){
				s1=v[a]+v[b];
				nec=w[i].p-s1%w[i].p;
				if(nec==w[i].p) nec=0;
				for(c=b+1;c<n;c++){
					if(v[c]%w[i].p!=nec) continue;
					s=s1+v[c];
					if(s>sm) sm=s;
					else break;
					}
				}
		   }
		   break;
	case 4:for(a=0;a<n-3;a++){
			  for(b=a+1;b<n-2;b++){
				s1=v[a]+v[b];
				for(c=b+1;c<n-1;c++){
					s2=s1+v[c];
					nec=w[i].p-s2%w[i].p;
					if(nec==w[i].p) nec=0;
					for(d=c+1;d<n;d++){
						if(v[d]%w[i].p!=nec) continue;
						s=s2+v[d];
						if(s>sm) sm=s;
						else break;
						}
					}
				}
		   }
		   break;
	case 5:for(a=0;a<n-4;a++){
			  for(b=a+1;b<n-3;b++){
				s1=v[a]+v[b];
				for(c=b+1;c<n-2;c++){
					s2=s1+v[c];
					for(d=c+1;d<n-1;d++){
						s3=s2+v[d];
						nec=w[i].p-s3%w[i].p;
						if(nec==w[i].p) nec=0;
						for(e=d+1;e<n;e++){
							if(v[e]%w[i].p!=nec) continue;
							s=s3+v[e];
							if(s>sm) sm=s;
							else break;
							}
						}
					}
				}
		   }
		   break;
	}
	w[i].r=sm;
	}
qsort(w,m,sizeof(w[0]),fcmp2);
for(i=0;i<m;++i) printf("%d\n",w[i].r);
return 0;
}