tjut 4630
2016-07-27 21:26
447 查看
/* * Author:kuangbin * 1010.cpp */ #include <stdio.h> #include <algorithm> #include <string.h> #include <iostream> #include <map> #include <vector> #include <queue> #include <set> #include <string> #include <math.h> using namespace std; const int MAXN = 50010; int c[MAXN]; int n; int lowbit(int x) { return x&(-x); } void add(int i,int val) { while(i <= n) { c[i] = max(c[i],val); i += lowbit(i); } } int Max(int i) { int s = 0; while(i > 0) { s = max(s,c[i]); i -= lowbit(i); } return s; } int a[MAXN]; int b[MAXN]; int ans[MAXN]; struct Node { int l,r; int index; }node[MAXN]; bool cmp(Node a,Node b) { return a.l > b.l; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int T; int m; int l,r; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i = 1;i <= n;i++) scanf("%d",&a[i]); scanf("%d",&m); for(int i = 0;i < m;i++) { scanf("%d%d",&node[i].l,&node[i].r); node[i].index = i; } sort(node,node+m,cmp); int i = n; int j = 0; memset(b,0,sizeof(a)); memset(c,0,sizeof(c)); while(j < m) { while(i > 0 && i>= node[j].l) { for(int k =1;k*k <= a[i];k++) { if(a[i]%k == 0) { if(b[k]!=0) { add(b[k],k); } b[k] = i; if(k != a[i]/k) { if(b[a[i]/k]!=0) { add(b[a[i]/k],a[i]/k); } b[a[i]/k]=i; } } } i--; } while(j < m && node[j].l > i) { ans[node[j].index]=Max(node[j].r); j++; } } for(int i = 0;i < m;i++) printf("%d\n",ans[i]); } return 0; }
相关文章推荐
- 从1到n整数中1出现的次数
- 10009---怎么查看linux版本
- Memcache的最佳实践方案
- 认识Servlet
- 10009---压力测试之badboy和Jmeter的简单使用方法
- HDU 1241 Oil Deposits(深搜基础模板)
- 什么东西只花十分钟,但是受益终身
- laravel5数据库操作
- Ionic环境搭建
- 使用class-dump导出其他应用头文件
- JSTL的配置与使用
- 奇怪的问题,列名无效
- Codeforces-448【A数学函数ceil】【B思维】【D二分】
- Redis 和 Memcache 的性能对比基础篇
- 项目安排[动态规划]
- 基于spark的DataFrame实战
- Struts2的三种参数传递方式
- HDOJ 1551 Cable master
- JAVA中实现链式操作(方法链)的简单例子
- 图形学(7)光照模型