#include <bits/stdc++.h> using namespace std; #define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define endl "\n" #define int long long typedef struct data { data* bit[2]; int cnt = 0; int sum = 0; }trie; trie* head; void insert(int x, int val) { trie* cur = head; for(int i = 60; i >= 0; i--) { int b = (x >> i) & 1; if(!cur->bit[b]) cur -> bit[b] = new trie(); cur = cur -> bit[b]; cur->cnt++; cur->sum += val; } } int query(int x) { trie* cur = head; int ans = 0; for(int i = 60; i >= 0; i--) { int b = (x >> i) & 1; if(b == 0 && !cur->bit[b]) return ans; else if(b == 0) cur = cur->bit[b]; else { if(cur->bit[0] != NULL) ans += (cur->bit[0])->sum; if(!cur->bit[b]) return ans; cur = cur->bit[b]; } } return ans; } int32_t main() { IOS; head = new trie(); int prev = 0; int q, m1 = 1e9, m2 = 1e9; cin >> q >> m1 >> m2; map<int, int> val; while(q--) { int type, a, b; cin >> type; if(type == 1) { cin >> a >> b; int x = (a + prev) % m1 + 1; int y = (b + prev) % m2 + 1; if(val.find(x) != val.end()) insert(x, -val[x]); val[x] = y; insert(x, val[x]); } else { cin >> a; int x = (a + prev) % m1 + 1; prev = query(x); if(val.find(x) != val.end()) prev += val[x]; cout << prev << endl; } } return 0; }