Cod sursa(job #350458)

Utilizator ProtomanAndrei Purice Protoman Data 23 septembrie 2009 22:23:29
Problema Tricouri Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <algorithm>
#include <stdio.h>
#include <vector>

#define MAX 300010
#define INF 10000010
#define pb push_back

using namespace std;

int n, m;
int el[MAX];
int vctEl[32][8], pos[32][8], sol[32][8];

int main()
{
	freopen("tricouri.in", "r", stdin);
	freopen("tricouri.out", "w", stdout);

	scanf("%d %d", &n, &m);

	for (int i = 1; i <= n; i++)
		scanf("%d", &el[i]);

	for (int p = 2; p <= 20; p++)
	{
		for (int r = 0; r < p; r++)
			for (int t = 0; t <= 5; t++)
				pos[r][t] = -INF;
		vector <int> vctNr;
		memset(vctEl, 0, sizeof(vctEl));

		for (int i = 1; i <= n; i++)
		{
			int loc = el[i] % p;
			vctEl[loc][++vctEl[loc][0]] = el[i];
			
			for (int j = vctEl[loc][0]; j > 1; j--)
				if (vctEl[loc][j] > vctEl[loc][j - 1])
					swap(vctEl[loc][j], vctEl[loc][j - 1]);
				
			if (vctEl[loc][0] > 5)
				vctEl[loc][0]--;
		}
		
		for (int r = 0; r < p; r++)
			for (int i = 1; i <= vctEl[r][0]; i++)
				vctNr.pb(vctEl[r][i]);

		pos[0][0] = 0;
		for (int el = 0; el < vctNr.size(); el++)
			for (int t = 5; t; t--)
				for (int r = 0; r < p; r++)
					pos[(r + vctNr[el]) % p][t] = max(pos[(r + vctNr[el]) % p][t], pos[r][t - 1] + vctNr[el]);

		for (int t = 1; t <= 5; t++)
			sol[p][t] = max(-1, pos[0][t]);
	}

	for (; m; m--)
	{
		int t, r;
		scanf("%d %d", &t, &r);

		printf("%d\n", sol[r][t]);
	}

	fclose(stdin);
	fclose(stdout);
	return 0;
}