比赛时候没想到,感觉弱爆了,做了两个月线段树白做了。。。。白做了。。。。
ACcode:
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int NS=50050;
struct node{
int l,r,id;
bool operator < (const node cmp) const{
return r<cmp.r;
}
void read(int _id)
{
scanf("%d%d",&l,&r);
id=_id;
}
}que[NS];
struct nodes{
int maxs,l,r;
};
struct segtree{
int val[NS];
int len;
void build (int n)
{
for (int i=0;i<=n;i++)
val[i]=0;
len =n;
}
void update(int pos,int v)
{
for(int i=pos;i<=len;i+=i&(-i))
{
val[i]=max(val[i],v);
}
}
int query(int l)
{
int ans=0;
for(int i=l;i>0;i-=i&(-i))
ans=max(val[i],ans);
return ans;
}
}tree;
int n,m;
int a[NS];
int pre[NS];
int ans[NS];
vector<int> dive[NS];
void init()
{
for(int i=1;i<NS;i++)
for(int j=i;j<NS;j+=i)
dive[j].push_back(i);
}
int main()
{
init();
int T;
for (scanf("%d",&T);T;T--)
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
tree.build(n);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
que[i].read(i);
}
sort(que+1,que+1+m);
memset(pre,0,sizeof(pre));
for(int i=1,k=1;i<=n;i++)
{
int x=a[i];
for(int j=0;j<dive[x].size();j++)
{
int v=dive[x][j];
if(pre[v]!=0)
tree.update(n-pre[v]+1,v);
pre[v]=i;
}
while (que[k].r==i&&k<=m)
{
int l=que[k].l,r=que[k].r;
ans[que[k].id]=tree.query(n+1-l);
k++;
}
}
for(int i=1;i<=m;i++)
printf("%d\n",ans[i]);
}
return 0;
}