#include #include #include using namespace std; class SegmentTree { vector lazy; int size; public: SegmentTree(int n) { size = n; lazy.resize(4 * n, 0); } void updateRange(int node, int start, int end, int l, int r, int val) { if (start > end || start > r || end < l) return; if (start >= l && end <= r) { lazy[node] = (lazy[node] + val) % 26; return; } int mid = (start + end) / 2; updateRange(2*node, start, mid, l, r, val); updateRange(2*node+1, mid+1, end, l, r, val); } int query(int node, int start, int end, int idx) { if (start > end) return 0; if (start == end) { return lazy[node]; } int mid = (start + end) / 2; int rot = lazy[node]; if (idx <= mid) { return (rot + query(2*node, start, mid, idx)) % 26; } else { return (rot + query(2*node+1, mid+1, end, idx)) % 26; } } void update(int l, int r, int val) { updateRange(1, 0, size-1, l-1, r-1, val); } int get(int idx) { return query(1, 0, size-1, idx-1); } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); string S, T; cin >> S >> T; SegmentTree segS(S.length()); SegmentTree segT(T.length()); int Q; cin >> Q; while (Q--) { int queryType; cin >> queryType; if (queryType == 1) { int l, r, x; cin >> l >> r >> x; segS.update(l, r, x); } else if (queryType == 2) { int l, r, x; cin >> l >> r >> x; segT.update(l, r, x); } else if (queryType == 3) { int p; cin >> p; char actualS = 'a' + ((S[p-1] - 'a' + segS.get(p)) % 26); char actualT = 'a' + ((T[p-1] - 'a' + segT.get(p)) % 26); if (actualS > actualT) { cout << "Greater" << endl; } else if (actualS < actualT) { cout << "Lesser" << endl; } else { cout << "Equals" << endl; } } } return 0; }