Cod sursa(job #254219)

Utilizator Bogdan_tmmTirca Bogdan Bogdan_tmm Data 7 februarie 2009 00:52:39
Problema Caramizi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include<iostream>
#include<stdio.h>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a>b?b:a)
FILE *f=fopen("caramizi.in","r"),*g=fopen("caramizi.out","w");
long n,m;
long long a[200000],b[200000],sol[2000000],i,j,max1,s,poz,min1=100000000,aux,ant,ant1;
void qsort(long long st,long long dr)
{
	long long i=st,j=dr,c=a[(st+dr)/2],aux;
	do
	{
		while(i<=j&&a[i]<c) i++;
		while(i<=j&&a[j]>c) j--;
		if(i<=j)
		{
			aux=a[i];a[i]=a[j];a[j]=aux;
			i++;j--;
		}
	}while(i<=j);
	if(st<j) qsort(st,j);
	if(i<dr) qsort(i,dr);
}
int main()
{
	fscanf(f,"%ld%ld",&n,&m);
	for(i=1;i<=n;i++)
		fscanf(f,"%lld",&a[i]);
	qsort(1,i-1);
	for(i=1;i<=m;i++)
	{
		fscanf(f,"%lld",&b[i]);
		max1=max(max1,b[i]);
		min1=min(min1,b[i]);
	}long long i1=1;
	for(i=min1,poz=1;i<=max1;i++)
	{
		while(a[poz]<i&&poz<n+1)
			s+=a[poz++];
		aux=s/i*i;
		sol[i-min1+1]=(n-poz+1)*i+aux;
		sol[i-min1+1]=max(sol[i-min1+1],sol[i-min1+1-1]);
		ant1=ant;
	}	
	for(i=1;i<=m;i++)
		fprintf(g,"%lld\n",sol[b[i]-min1+1]);
	return 0;
}