#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
long long tru(long long a, long long b) {
return ((a - b) % MOD + MOD) % MOD;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
vector<long long> cp(n+1, 0LL);
vector<long long> lastP(n+1, 0LL);
vector<long long> money(n+1, 0LL);
long long P = 0;
while (q--) {
int type;
cin >> type;
if (type == 1) {
int p;
long long x;
cin >> p >> x;
money[p] = (money[p] + ((cp[p] % MOD) * tru(P, lastP[p])) % MOD) % MOD;
lastP[p] = P;
cp[p] += x;
}
else if (type == 2) {
long long v;
cin >> v;
P = (P + (v % MOD) + MOD) % MOD;
}
else {
int p;
cin >> p;
money[p] = (money[p] + ((cp[p] % MOD) * tru(P, lastP[p])) % MOD) % MOD;
lastP[p] = P;
cout << (money[p] % MOD) << "\n";
money[p] = 0;
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGludCBNT0QgPSAxMDAwMDAwMDA3OwoKCmxvbmcgbG9uZyB0cnUobG9uZyBsb25nIGEsIGxvbmcgbG9uZyBiKSB7CiAgICByZXR1cm4gKChhIC0gYikgJSBNT0QgKyBNT0QpICUgTU9EOwp9CgppbnQgbWFpbigpIHsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CgogICAgaW50IG4sIHE7CiAgICBjaW4gPj4gbiA+PiBxOwoKICAgIHZlY3Rvcjxsb25nIGxvbmc+IGNwKG4rMSwgMExMKTsKICAgIHZlY3Rvcjxsb25nIGxvbmc+IGxhc3RQKG4rMSwgMExMKTsKICAgIHZlY3Rvcjxsb25nIGxvbmc+IG1vbmV5KG4rMSwgMExMKTsKCiAgICBsb25nIGxvbmcgUCA9IDA7CgogICAgd2hpbGUgKHEtLSkgewogICAgICAgIGludCB0eXBlOwogICAgICAgIGNpbiA+PiB0eXBlOwogICAgICAgIGlmICh0eXBlID09IDEpIHsKICAgICAgICAgICAgaW50IHA7CiAgICAgICAgICAgIGxvbmcgbG9uZyB4OwogICAgICAgICAgICBjaW4gPj4gcCA+PiB4OwogICAgICAgICAgICBtb25leVtwXSA9IChtb25leVtwXSArICgoY3BbcF0gJSBNT0QpICogdHJ1KFAsIGxhc3RQW3BdKSkgJSBNT0QpICUgTU9EOwogICAgICAgICAgICBsYXN0UFtwXSA9IFA7CiAgICAgICAgICAgIGNwW3BdICs9IHg7IAogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlID09IDIpIHsKICAgICAgICAgICAgbG9uZyBsb25nIHY7CiAgICAgICAgICAgIGNpbiA+PiB2OwogICAgICAgICAgICBQID0gKFAgKyAodiAlIE1PRCkgKyBNT0QpICUgTU9EOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaW50IHA7CiAgICAgICAgICAgIGNpbiA+PiBwOwogICAgICAgICAgICBtb25leVtwXSA9IChtb25leVtwXSArICgoY3BbcF0gJSBNT0QpICogdHJ1KFAsIGxhc3RQW3BdKSkgJSBNT0QpICUgTU9EOwogICAgICAgICAgICBsYXN0UFtwXSA9IFA7CiAgICAgICAgICAgIGNvdXQgPDwgKG1vbmV5W3BdICUgTU9EKSA8PCAiXG4iOwogICAgICAgICAgICBtb25leVtwXSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9CgoK