かなり私の弟のグループは/ KK速く走るか質問を理解していません
トライの考えることは困難最大、そこでXOR \(GCDは\)ことを指摘し、より迷惑な制限です\(Xの\の当量10 ^ 5 \)がある\(X \) 、数はあまり考慮しません。その後、我々は維持することができます\(10 ^ 5 \)をトライ、第一番目の\(k個\)すべての表現\(K \)トライの複数からなる番号、あなただけは、必ず最初に聞いて依頼する必要があります\(k個の\を)トライは、もちろん、私たちは、最初に確認する必要がありますすることができます\(kは| X \)
彼は左(Vを\当量SX \)\制限最小サブツリーを満たしていない場合は、トライ木サブツリーのそのレコードのすべてのポイントの下にこれをよりリラックスした、最小値は、この制限は必要ありませんもう聞きし続けます
前処理\(^ 1-10 5 \)すべての多くの要因のすべてで、これはかもしれ\(O(nlogn)\)完了するために、
#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<math.h>
#include<queue>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
typedef long double db;
typedef pair<int,int> pii;
const int N=100000;
const db pi=acos(-1.0);
#define lowbit(x) (x)&(-x)
#define sqr(x) (x)*(x)
#define rep(i,a,b) for (register int i=a;i<=b;i++)
#define per(i,a,b) for (register int i=a;i>=b;i--)
#define fir first
#define sec second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define maxd 998244353
#define eps 1e-8
int ch[30002000][2],minx[30002000],root[100100],tot=0,val[30002000];
vector<int> fac[100100];
int read()
{
int x=0,f=1;char ch=getchar();
while ((ch<'0') || (ch>'9')) {if (ch=='-') f=-1;ch=getchar();}
while ((ch>='0') && (ch<='9')) {x=x*10+(ch-'0');ch=getchar();}
return x*f;
}
void insert(int &now,int x,int d)
{
if (!now) {now=(++tot);minx[now]=maxd;}
minx[now]=min(minx[now],x);
if (d<0) {val[now]=x;return;}
insert(ch[now][(x>>d)&1],x,d-1);
}
int query(int now,int lim,int x,int d)
{
if (d<0) return val[now];
int ch0=ch[now][0],ch1=ch[now][1];
if ((!ch0) || (minx[ch0]>lim)) return query(ch1,lim,x,d-1);
if ((!ch1) || (minx[ch1]>lim)) return query(ch0,lim,x,d-1);
return query(ch[now][((x>>d)&1)^1],lim,x,d-1);
}
int main()
{
rep(i,1,N)
for (int j=i;j<=N;j+=i) fac[j].pb(i);
int q=read();
while (q--)
{
int op=read();
if (op==1)
{
int x=read(),len=fac[x].size();
rep(i,0,len-1)
{
int y=fac[x][i];
insert(root[y],x,18);
}
}
else
{
int x=read(),k=read(),s=read();
if ((x%k) || (!minx[root[k]]) || (minx[root[k]]>s-x)) puts("-1");
else printf("%d\n",query(root[k],s-x,x,18));
}
}
return 0;
}