#define ll long long #define I inline #define N 100001
usingnamespacestd;
structChange{//opt为操作类型,id为操作编号,a为被修改数的下标,b为被修改后的分子,c为分母 ll opt , id , a , b , c; }node1[N] , node2[N] , node3[N] , ans[N];
ll num1 , num2 , num3; //记录三种操作的数量
I boolcmp1(Change A , Change B){ return (A.a != B.a) ? A.a < B.a : A.b < B.b; }
I boolcmp2(Change A , Change B){ return (A.a != B.a) ? A.a < B.a : A.b > B.b; }
I boolcmp3(Change A , Change B){ return A.b * B.c > A.c * B.b; }
I boolcmp4(Change A , Change B){ return A.opt < B.opt; }
ll n , m , s; ll a[N];
intmain(){ cin >> n >> m >> s; for(int i = 1; i <= n; i ++){ cin >> a[i]; } int x , y , z; for(int i = 1; i <= m; i ++){ cin >> z >> x >> y; if(z == 1 && y > a[x]){ //如果将一个数改成比他小的数,还不如不改。 node1[++ num1] = (Change){1 , i , x , y , 1}; } elseif(z == 2){ node2[++ num2] = (Change){2 , i , x , y , 1}; } elseif(z == 3){ node3[++ num3] = (Change){3 , i , x , y , 1}; }
} sort(node1 + 1 , node1 + 1 + num1 , cmp1); //将操作1排一遍序 int tmp = 0; for(int i = 1; i <= num1; i ++){ if(node1[i].a != node1[i + 1].a){ //对于每一个位置选出最大的数 node1[++ tmp] = node1[i]; } } num1 = tmp; for(int i = 1; i <= num1; i ++){ //将操作1改为操作2 node2[++ num2].opt = node1[i].opt; node2[num2].id = node1[i].id; node2[num2].a = node1[i].a; node2[num2].b = node1[i].b - a[node1[i].a]; } sort(node2 + 1 , node2 + 1 + num2 , cmp2); ll sum = 0; for(int i = 1; i <= num2; i ++) { if(node2[i].a != node2[i - 1].a){ sum = a[node2[i].a]; } node2[i].c = sum, sum += node2[i].b; } for(int i = 1; i <= num3; i ++){ node3[i].b -= 1; } for(int i = 1; i <= num2; i ++){ node3[++ num3] = node2[i]; //将操作2改成操作3 } sort(node3 + 1 , node3 + 1 + num3 , cmp3); ll number = min(num3 , s); //如果可以用的操作数大于总操作数,就都用上。 int cnt = 0; for(int i = 1; i <= number; i ++){ ans[++ cnt] = node3[i]; } cout << cnt << "\n"; sort(ans + 1 , ans + 1 + cnt , cmp4); for(int i = 1; i <= cnt; i ++){ cout << ans[i].id << " "; } return0; }