#include using namespace std; using i64 = long long; int n, q, len; const i64 base1 = 2e7 + 1, base2 = 2e7 + 3; const i64 mod1 = 1e9 + 7, mod2 = 1e9 + 9; i64 pw1[1000010], pw2[1000010]; i64 sm1[1000010], sm2[1000010]; int main() { scanf("%d%d", &n, &q); pw1[0] = pw2[0] = 1; for (int i = 1; i <= n; i ++) { pw1[i] = pw1[i - 1] * base1 % mod1; pw2[i] = pw2[i - 1] * base2 % mod2; } for (int i = 1; i <= n; i ++) { sm1[i] = (sm1[i - 1] + pw1[i - 1]) % mod1; sm2[i] = (sm2[i - 1] + pw2[i - 1]) % mod2; } map, int> ans; int cur1 = 0, cur2 = 0; ans[{cur1, cur2}] = 0; for (int id = 1; id <= q; id ++) { char op; scanf(" %c", &op); if (op == '!') { int l, r, x; scanf("%d%d%d", &l, &r, &x); cur1 = (cur1 + (sm1[r] - sm1[l] + mod1) % mod1 * x % mod1 + mod1) % mod1; cur2 = (cur2 + (sm2[r] - sm2[l] + mod2) % mod2 * x % mod2 + mod2) % mod2; if (ans.find({cur1, cur2}) == ans.end()) ans[{cur1, cur2}] = id; } else { printf("%d\n", ans[{cur1, cur2}]); } } return 0; }