Cod sursa(job #265922)

Utilizator mariusdrgdragus marius mariusdrg Data 24 februarie 2009 19:06:08
Problema Caramizi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
#define pb push_back
#define mkp make_pair

using namespace std;

const int maxn = 201000;

vector<pair<int,int> > VECT;
int N,M;
long long ANSF[maxn];

int main()
{
	freopen("caramizi.in","r",stdin);
	freopen("caramizi.out","w",stdout);
	scanf("%d %d\n",&N,&M);
	for(int i = 1;i <= N; ++i)
	{
		int x = 0;
		scanf("%d ",&x);
		VECT.pb(mkp(x,-1));
	}
	int cordmax = 0;
	for(int i = 1;i <= M; ++i)
	{
		int x = 0;
		scanf("%d ",&x);
		VECT.pb(mkp(x,i));
		cordmax = max(x,cordmax);
	}
	for(int i = 1;i <= cordmax; ++i)
		VECT.pb(mkp(i,0));
	sort(VECT.begin(),VECT.end());
	int last = 0;
	long long anscur = 0,ans = 0;
	int nrc = N;
	for(unsigned int i = 0;i < VECT.size(); ++i)
	{
		int cur = VECT[i].first,poz = VECT[i].second;
		if (poz == -1)
		{
			ans += (long long)(cur - last) * nrc;	
			anscur = max(anscur,ans - ans % cur);
			nrc -= 1;
			last = cur;
		}
		else 
		{
			ans += (long long)(cur - last) * nrc;
			anscur = max(anscur,ans - ans % cur);
			last = cur;
			ANSF[poz] = anscur;
		}
	}
	for(int i = 1;i <= M; ++i)
		printf("%lld\n",ANSF[i]);
	return 0;
}