#include #include #include #include void sorter( int tab[], int size) { int temp, j; for(int i = 1; i < size; i++) { temp = tab[ i ]; for(j = i-1; j >= 0 && tab[j] > temp; j--) tab[j+1] = tab[j]; tab[j+1] = temp; } } int tables_count = 0; int size_limit = 0; int concats = 0; int param_G = 0; int param_H = 0; int* table = NULL; int size_table = 0; int counter = 0; int output_sum = 0; int* tables_sizes = NULL; int** tables = NULL; std::priority_queue output_data; std::map map; int main(int argc, char *argv[]) { // fast std::cin, declare in main() std::ios::sync_with_stdio(false); std::cin >> tables_count; std::cin >> size_limit; std::cin >> concats; tables = new int*[tables_count]; tables_sizes = new int[tables_count]; for(int table_id = 0; table_id < tables_count; table_id++) { std::cin >> size_table; table = new int[size_table]; for(int i2 = 0; i2 < size_table; i2++) std::cin >> table[i2]; sorter(table, size_table); tables[table_id] = table; tables_sizes[table_id] = size_table; } for(int concat = 0; concat < concats; concat++) { std::cin >> param_G; std::cin >> param_H; if(output_sum & 1 == 1) { table = tables[param_H]; for(int i2 = 0; i2 < tables_sizes[param_H]; i2++) if(output_data.size() == 0 || output_data.size() < size_limit || tables[param_H][i2] < output_data.top()) { output_sum += tables[param_H][i2]; output_data.push(tables[param_H][i2]); if(size_limit < output_data.size()) { output_sum -= output_data.top(); output_data.pop(); } } else break; } else { table = tables[param_G]; for(int i2 = 0; i2 < tables_sizes[param_G]; i2++) if(output_data.size() == 0 || output_data.size() < size_limit || tables[param_G][i2] < output_data.top()) { output_data.push(tables[param_G][i2]); output_sum += tables[param_G][i2]; if(size_limit < output_data.size()) { output_sum -= output_data.top(); output_data.pop(); } } else break; } } while(true) { map[output_data.top()] = '.'; output_data.pop(); if(output_data.empty()) break; } counter = map.size(); std::cout << output_sum; std::cout << " "; std::cout << counter; }