#include using namespace std; using u64 = unsigned long long; int n, q, len; int tr[(1 << 22) + 10]; int a[(1 << 20) + 10]; int ID = 0; unordered_map mp[22]; int bul(int dep, int x, int l, int r) { if (l == r) { return tr[x] = a[l] = 1e7 + rand() % 10000; } int m = (l + r) >> 1; u64 L = bul(dep + 1, x << 1, l, m); u64 R = bul(dep + 1, x << 1 | 1, m + 1, r); int &res = mp[dep][L << 32 | R]; if (res == 0) res = ++ ID; return tr[x] = res; } int add(int dep, int x, int l, int r, int p, int k) { if (l == r) { a[l] += k; return tr[x] = a[l]; } int m = (l + r) >> 1; u64 L = tr[x << 1], R = tr[x << 1 | 1]; if (p <= m) L = add(dep + 1, x << 1, l, m, p, k); else R = add(dep + 1, x << 1 | 1, m + 1, r, p, k); int &res = mp[dep][L << 32 | R]; if (res == 0) res = ++ ID; return tr[x] = res; } int main() { scanf("%d%d", &n, &q); len = 1; while (len < n) len <<= 1; map ans; int cur = bul(0, 1, 0, len - 1); ans[cur] = 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); cur = add(0, 1, 0, len - 1, l, x); if (r != n) cur = add(0, 1, 0, len - 1, r, -x); if (ans.find(cur) == ans.end()) ans[cur] = id; } else { printf("%d\n", ans[cur]); } } return 0; }