#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; const ll MOD = 1000000007; struct Node { int x; ll cnt; int updated_at; Node(int x = -1, ll cnt = -1, int updated_at = -1) { this->x = x; this->cnt = cnt; this->updated_at = updated_at; } bool operator>(const Node &n) const { if (cnt == n.cnt) { return x < n.x; } else { return cnt < n.cnt; } } }; int main() { ll N, M; cin >> N >> M; priority_queue , greater> pque; int time_table[M + 1]; ll counter[M + 1]; memset(time_table, 0, sizeof(time_table)); for (int i = 1; i <= M; ++i) { ll a; cin >> a; counter[i] = a; pque.push(Node(i, a, 0)); } int Q; cin >> Q; for (int i = 0; i < Q; ++i) { int t, x; ll y; cin >> t >> x >> y; // fprintf(stderr, "t: %d, x: %d, y: %lld\n", t, x, y); if (t == 1) { counter[x] += y; time_table[x]++; pque.push(Node(x, counter[x], time_table[x])); } else if (t == 2) { counter[x] -= y; time_table[x]++; pque.push(Node(x, counter[x], time_table[x])); } else { while (true) { Node node = pque.top(); if (node.updated_at < time_table[node.x]) { pque.pop(); } else { break; } } cout << pque.top().x << endl; } } return 0; }