Pagini recente » Cod sursa (job #2253399) | Cod sursa (job #2769868) | Cod sursa (job #731528) | Cod sursa (job #2105027) | Cod sursa (job #1130064)
#include <fstream>
#include <algorithm>
using namespace std;
bool f(long long t[20][5][6], int i, int j, int ind)
{
for (int k = 1; k < 6; k++)
if (t[i][j][k] == ind)
return false;
return true;
}
int main()
{
int n, q;
ifstream in("tricouri.in");
in >> n >> q;
int nr[300000] = { 0 };
for (int i = 0; i < n; i++)
{
in >> nr[i];
}
sort(nr, nr + n);
long long m[20][5][6];
for (int i = 0; i < 20; i++)
for (int j = 0; j < 5; j++)
for (int k = 0; k < 6; k++)
if (k == 0)
m[i][j][k] = 0;
else
m[i][j][k] = -1;
for (int i = 0; i < 20; i++)
{
int ind = n - 1;
while (nr[ind] % (i + 1) != 0 && ind >= 0)
ind--;
if (ind < 0)
;
else
{
m[i][0][0] = nr[ind];
m[i][0][1] = ind;
}
}
for (int i = 0; i < 20; i++)
{
for (int j = 1; j < 5; j++)
{
int index = i;
int indice = -1;
for (int k = 0; k < 20; k++)
{
int ind = n - 1;
while (((nr[ind] + m[k][j - 1][0]) % (i + 1) != 0 && ind >= 0) || !f(m, k, j - 1, ind))
ind--;
if (ind < 0)
;
else if (nr[ind] + m[k][j - 1][0] > m[index][j][0])
{
index = k;
indice = ind;
}
}
if (indice != -1)
{
m[i][j][0] = nr[indice] + m[index][j - 1][0];
for (int l = 1; l <= j; l++)
m[i][j][l] = m[index][j - 1][l];
m[i][j][j + 1] = indice;
}
}
}
ofstream out("tricouri.out");
int k, p;
for (int i = 0; i < q; i++)
{
in >> k >> p;
out << (m[p - 1][k - 1][0] == 0 ? -1 : m[p - 1][k - 1][0]) << '\n';
}
in.close();
out.close();
}