Всё-таки решил попробовать протестировать алгоритм на C++, как предложил
Дмитрий в его ответе. Как и ожидалось, программа завалилась на 22 тесте с вердиктом TL.
Собственно, ниже код программы на C++.
#include <iostream>
#include <string>
#include <sstream>
#include <iterator>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> readLine();
int m_N;
int m_D;
int m_Q;
int m_listA[100];
int m_listD[100000][100];
int m_listQ[100000][4];
int m_listR[100000];
struct CPair
{
int rel;
int num;
};
int main()
{
vector<int> vars = readLine();
m_N = vars[0];
vars = readLine();
for (int n = 0; n < m_N; n++)
m_listA[n] = vars[n];
vars = readLine();
m_D = vars[0];
for (int d = 0; d < m_D; d++)
{
vars = readLine();
for (int n = 0; n < m_N; n++)
{
m_listD[d][n] = vars[n];
m_listR[d] += m_listA[n] * vars[n];
}
}
vars = readLine();
m_Q = vars[0];
for (int q = 0; q < m_Q; q++)
{
vars = readLine();
for (int i = 0; i < vars.size(); i++)
m_listQ[q][i] = vars[i];
}
vector<CPair> pairs(100000);
for(int r = 0; r < m_D; r++)
{
pairs[r].rel = m_listR[r];
pairs[r].num = r + 1;
}
sort(pairs.begin(), pairs.begin() + m_D,
[](CPair const &a, CPair const &b){ return a.rel > b.rel;});
for (int q = 0; q < m_Q; q++)
{
if (m_listQ[q][0] == 1)
{
for (int i = 0; i < m_listQ[q][1]; i++)
cout << pairs[i].num << " ";
cout<<endl;
}
else
{
int d = m_listQ[q][1] - 1;
int j = m_listQ[q][2] - 1;
int v = m_listQ[q][3];
int oldPart = m_listD[d][j] * m_listA[j];
int newPart = v * m_listA[j];
int div = oldPart - newPart;
m_listR[d] -= div;
m_listD[d][j] = v;
for (int i = 0; i < m_D; i++)
{
if (pairs[i].num == (d + 1))
{
pairs[i].rel = m_listR[d];
sort(pairs.begin(), pairs.begin() + m_D,
[](CPair const &a, CPair const &b){ return a.rel > b.rel;});
break;
}
}
}
}
//system("pause");
return 0;
}
vector<int> readLine()
{
string input = "";
getline(cin, input);
istringstream iss(input);
vector<int> vars;
copy(istream_iterator<int>(iss),
istream_iterator<int>(),
back_inserter(vars));
return vars;
}