RMQ

区间最值访问

#include <iostream>
  #include <cstdio>
  #include <cmath>
  #define max(a,b) (a>b?a:b)
  #define min(a,b) (a<b?a:b)
  #define MN 50005
  using namespace std;
  int mi[MN][17],mx[MN][17],w[MN];
  int n,q;
  void rmqinit()
  {
  int i,j,m;
  for(i=1;i<=n;i++){mi[i][0]=mx[i][0]=w[i];}
  m=floor(log((double)n)/log(2.0));
  for(i=1;i<=m;i++)
  {
  for(j=n;j>=1;j--)
  {
  mx[j][i]=mx[j][i-1];
  if(j+(1<<(i-1))<=n)mx[j][i]=max(mx[j][i],mx[j+(1<<(i-1))][i-1]);
  mi[j][i]=mi[j][i-1];
  if(j+(1<<(i-1)<=n))mi[j][i]=min(mi[j][i],mi[j+(1<<(i-1))][i-1]);
  }
  }
  }
  int rmqmin(int l,int r)
  {
  int m=floor(log((double)(r-l+1))/log(2.0));
  return min(mi[l][m],mi[r-(1<<m)+1][m]);
  }
  int rmqmax(int l,int r)
  {
  int m=floor(log((double)(r-l+1))/log(2.0));
  return max(mx[l][m],mx[r-(1<<m)+1][m]);
  }
  int main()
  {
  cin>>n>>q;
  for(int i=1;i<=n;i++)scanf("%d",&w[i]);//cin>>w[i];
  rmqinit();
  int l,r;
  for(int i=1;i<=q;i++)
  {
  scanf("%d%d",&l,&r);//cin>>l>>r;
  printf("%d %d\n",rmqmax(l,r),rmqmin(l,r));
  //cout<<rmqmax(l,r)<<" "<<rmqmin(l,r)<<endl;
  }
  while(cin>>n)
  return 0;
  }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值