#include <bits/stdc++.h>   using namespace std;   vector<int> di[100003];   struct trie {     trie *zero, *one;     int val;     trie() {       zero = one = NULL;       val = 100003;     }   } * root[100003];   void add(trie *cur, int a) {     int i, ck;     for (i = 20; i >= 0; i--) {       ck = (1 << i & a);       if (ck == 0) {         cur->val = min(cur->val, a);         if (cur->zero == NULL) cur->zero = new trie();         cur = cur->zero;         cur->val = min(cur->val, a);       } else {         cur->val = min(cur->val, a);         if (cur->one == NULL) cur->one = new trie();         cur = cur->one;         cur->val = min(cur->val, a);       }     }   }   int query(trie *cur, int a, int lim) {     int i, ck, ans;     for (i = 20; i >= 0; i--) {       ck = (1 << i & a);       if (ck == 0) {         if (cur->one != NULL && cur->one->val + a <= lim)           cur = cur->one;         else if (cur->zero != NULL)           cur = cur->zero;         ans = cur->val;       } else {         if (cur->zero != NULL && cur->zero->val + a <= lim)           cur = cur->zero;         else if (cur->one != NULL)           cur = cur->one;         ans = cur->val;       }     }     return ans;   }   void pre() {     for (int i = 1; i < 100003; i++) {       for (int j = i; j < 100003; j += i) di[j].push_back(i);       root[i] = new trie();     }   }   int main() {     pre();     int q, a, k, s, v, ty;     scanf( %d , &q);     while (q--) {       scanf( %d , &ty);       if (ty == 1) {         scanf( %d , &a);         for (int x : di[a]) {           add(root[x], a);         }       } else {         scanf( %d %d %d , &v, &k, &s);         if (root[k]->val + v > s || root[k]->val == 0 || v % k)           printf( -1 n );         else           printf( %d n , query(root[k], v, s));       }     }     return 0;   }   