#include <bits/stdc++.h>   using namespace std;   struct Upgrade {     int id, i, val;     Upgrade(int _id = 0, int _i = 0, int _val = 0) : id(_id), i(_i), val(_val) {}     friend bool operator<(const Upgrade &a, const Upgrade &b) {       return a.val < b.val;     }   };   struct Data {     Upgrade upgrade;     long long nume, deno;     int id;     Data(int _id = 0, long long _nume = 0, long long _deno = 0,          Upgrade _upgrade = Upgrade())         : id(_id), nume(_nume), deno(_deno), upgrade(_upgrade) {}     friend bool operator<(const Data &a, const Data &b) {       return double(a.nume) / a.deno < double(b.nume) / b.deno;     }   };   int n, m, k;   long long a[100010];   bool is_assg[100010];   Upgrade assg[100010];   vector<Upgrade> mult;   vector<Upgrade> add;   vector<Upgrade> add_list[100010];   priority_queue<Data> q;   double sum_mult[100010], sum;   bool cmp(const Upgrade &a, const Upgrade &b) { return b < a; }   int main() {     ios_base::sync_with_stdio(false);     cin >> n >> m >> k;     for (int i = 1; i <= n; i++) cin >> a[i];     memset(assg, -1, sizeof assg);     for (int i = 1; i <= m; i++) {       Upgrade upgrade(i);       int type;       cin >> type >> upgrade.i >> upgrade.val;       if (type == 1) {         is_assg[i] = 1;         if (assg[upgrade.i] < upgrade) assg[upgrade.i] = upgrade;       } else if (type == 2)         add_list[upgrade.i].push_back(upgrade);       else         mult.push_back(upgrade);     }     for (int i = 1; i <= n; i++) {       if (assg[i].id != -1) {         assg[i].val -= a[i];         add_list[i].push_back(assg[i]);       }       sort(add_list[i].begin(), add_list[i].end());       if (!add_list[i].empty()) {         q.push(Data(i, a[i] + add_list[i].back().val, a[i], add_list[i].back()));         add_list[i].pop_back();       }     }     while (!q.empty()) {       Data data = q.top();       q.pop();       add.push_back(data.upgrade);       int i = data.id;       if (!add_list[i].empty()) {         q.push(Data(i, data.nume + add_list[i].back().val,                     data.deno + data.upgrade.val, add_list[i].back()));         add_list[i].pop_back();       }     }     sort(mult.begin(), mult.end(), cmp);     sum_mult[0] = 0;     for (int i = 1; i <= mult.size(); i++)       sum_mult[i] = sum_mult[i - 1] + log(mult[i - 1].val);     sum = 0;     for (int i = 1; i <= n; i++) sum += log(a[i]);     double max_sum = sum + sum_mult[min((int)mult.size(), k)];     int optimal = 0;     for (int i = 0; i < add.size() && i < k; i++) {       sum -= log(a[add[i].i]);       a[add[i].i] += add[i].val;       sum += log(a[add[i].i]);       double total = sum + sum_mult[min((int)mult.size(), k - i - 1)];       if (total > max_sum) {         max_sum = total;         optimal = i + 1;       }     }     vector<int> trace;     for (int i = 0; i < optimal; i++)       if (is_assg[add[i].id]) trace.push_back(add[i].id);     for (int i = 0; i < optimal; i++)       if (!is_assg[add[i].id]) trace.push_back(add[i].id);     for (int i = 0; i < min((int)mult.size(), k - optimal); i++)       trace.push_back(mult[i].id);     cout << trace.size() <<   n ;     for (int i = 0; i < trace.size(); i++) cout << trace[i] <<    ;     return 0;   }