Pagini recente » Cod sursa (job #39124) | Cod sursa (job #3242839) | Cod sursa (job #19558) | Cod sursa (job #18082) | Cod sursa (job #19080)
Cod sursa(job #19080)
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define MAX_N 300005
#define MAX_K 5
#define MAX_P 25
#define FIN "tricouri.in"
#define FOUT "tricouri.out"
int N, M, K, P, A[MAX_N], pos[MAX_P][MAX_P], t, Res;
vector<int> V[MAX_P][MAX_P];
priority_queue<int> H[MAX_P];
void bkt(int lv, int mod)
{
int i;
if (lv == K-1)
{
i = (P-mod)%P;
if (pos[P][i] == V[P][i].size()) return;
t -= V[P][i][pos[P][i]];
if (Res < t) Res = t;
t += V[P][i][pos[P][i]];
return;
}
for (i = 0; i < P; i++)
{
if (pos[P][i] == V[P][i].size()) continue;
t -= V[P][i][pos[P][i]++];
bkt(lv+1, (mod+i)%P);
t += V[P][i][--pos[P][i]];
}
}
int main(void)
{
int i, j, t;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d %d", &N, &M);
for (i = 0; i < N; i++)
scanf("%d", A+i);
for (i = 2; i <= 20; i++)
{
for (j = 0; j < N; j++)
{
H[t = A[j]%i].push(-A[j]);
if (H[t].size() > MAX_K)
H[t].pop();
}
for (j = 0; j < i; j++)
{
while (!H[j].empty())
{
V[i][j].push_back(H[j].top());
H[j].pop();
}
reverse(V[i][j].begin(), V[i][j].end());
}
}
for (; M; M--)
{
scanf("%d %d", &K, &P);
Res = -1; t = 0;
bkt(0, 0);
printf("%d\n", Res);
}
return 0;
}