1 10 8 2 4 9 5 7 10 6 1 3 5 2 10 2 4 6 9 1 4 7 10
5 2 2 4 3
#include <iostream> #include <stdio.h> #include <string.h> #include <string> #include <stack> #include <queue> #include <map> #include <set> #include <vector> #include <math.h> #include <bitset> #include <list> #include <algorithm> #include <climits> using namespace std; #define lson 2*i #define rson 2*i+1 #define ls l,mid,lson #define rs mid+1,r,rson #define UP(i,x,y) for(i=x;i<=y;i++) #define DOWN(i,x,y) for(i=x;i>=y;i--) #define MEM(a,x) memset(a,x,sizeof(a)) #define W(a) while(a) #define gcd(a,b) __gcd(a,b) #define LL long long #define N 50005 #define INF 0x3f3f3f3f #define EXP 1e-8 #define mpa make_pair #define lowbit(x) (x&-x) const int mod = 10007; struct node { int l,r,id; } op[N]; int tree[N<<2],a[N],ans[N]; int cmp(node a,node b) { return a.r<b.r; } void pushup(int i) { tree[i] = max(tree[lson],tree[rson]); } void build() { MEM(tree,0); } void updata(int pos,int val,int l,int r,int i) { if(l==r) { tree[i] = max(tree[i],val); } else { int mid = (l+r)/2; if(pos<=mid) updata(pos,val,ls); else updata(pos,val,rs); pushup(i); } } int query(int L,int R,int l,int r,int i) { if(L<=l&&r<=R) { return tree[i]; } else { int mid = (l+r)/2; int ans1=0,ans2=0; if(L<=mid) ans1=query(L,R,ls); if(R>mid) ans2=query(L,R,rs); return max(ans1,ans2); } } int n,m; int pre[N]; int main() { int t,i,j,k,x; scanf("%d",&t); while(t--) { scanf("%d",&n); build(); for(i = 1; i<=n; i++) scanf("%d",&a[i]); scanf("%d",&m); for(i = 0; i<m; i++) { scanf("%d%d",&op[i].l,&op[i].r); op[i].id = i; } sort(op,op+m,cmp); MEM(pre,-1); int cnt=0; for(i = 1; i<=n; i++) { for(j = 1; j*j<=a[i]; j++) { if(a[i]%j==0) { if(pre[j]!=-1) { updata(pre[j],j,1,n,1); } if(j*j!=a[i]&&pre[a[i]/j]!=-1) { updata(pre[a[i]/j],a[i]/j,1,n,1); } pre[j] = pre[a[i]/j] = i; } } while(cnt<m&&op[cnt].r==i) { ans[op[cnt].id] = query(op[cnt].l,i,1,n,1); cnt++; } } for(i = 0; i<m; i++) printf("%d\n",ans[i]); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/libin56842/article/details/46767421