hdu 4630 No Pain No Game 树状数组

来源:互联网 发布:csol刀战优化辅助 编辑:程序博客网 时间:2024/05/18 13:07
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <vector>#include <utility>#include <algorithm>using namespace std;typedef pair<int,int>pii;const int maxn=50005;int n,Q;int a[maxn];int ans[maxn];int Max[maxn];int pre[maxn];vector<pii>q[maxn];vector<int>inzi[maxn];void init(){    for(int i=1;i<=50000;i++)    for(int j=i;j<=50000;j+=i)inzi[j].push_back(i);}int getsum(int x){    int res=0;    while(x)res=max(res,Max[x]),x-=x&-x;    return res;}void update(int x,int val){    while(x<=n)Max[x]=max(val,Max[x]),x+=x&-x;}int main(){//    freopen("in","r",stdin);    init();    int T;    cin>>T;    while(T--){        scanf("%d",&n);        for(int i=1;i<=n;i++)scanf("%d",a+i),q[i].clear();        scanf("%d",&Q);        for(int i=0;i<Q;i++){            int l,r;            scanf("%d%d",&l,&r);            q[l].push_back(make_pair(r,i));        }        memset(Max,0,sizeof Max);        memset(pre,-1,sizeof pre);        for(int i=n;i>=1;i--){            int now=a[i];            for(int j=0;j<inzi[now].size();j++){                int tmp=inzi[now][j];                if(pre[tmp]!=-1)update(pre[tmp],tmp);                pre[tmp]=i;            }            for(int j=0;j<q[i].size();j++){                pii now=q[i][j];                int r=now.first;                ans[now.second]=getsum(r);            }        }        for(int i=0;i<Q;i++)printf("%d\n",ans[i]);    }    return 0;}

0 0
原创粉丝点击