【题目链接:NYOJ-119

  思路:转自 点我 ,讲的挺好。

 #include <cstdio>
#include <math.h>
#define max(a,b) ((a>b)?a:b)
#define min(a,b) (a<b?a:b)
const int maxn=;
int h[maxn];
int mx[maxn][],mn[maxn][];
int n,q;
void rmq_init(){
int i,j,t;
for(j=;j<=n;j++) mx[j][]=mn[j][]=h[j];
int m=floor(log((double)n)/log(2.0));
for(i=;i<=m;i++){
for(j=;j<=n;j++){
t = j+(<<(i-));
if(t<=n) mx[j][i]=max(mx[j][i-],mx[t][i-]);
else mx[j][i]=mx[j][i-];
}
}
for(i=;i<=m;i++){
for(j=;j<=n;j++){
t = j+(<<(i-));
if(t<=n) mn[j][i]=min(mn[j][i-],mn[t][i-]);
else mn[j][i]=mn[j][i-];
}
}
}
int rmq(int l,int r){
int m=floor(log((double)(r-l+))/log(2.0));
int a=max(mx[l][m],mx[r-(<<m)+][m]);
int b=min(mn[l][m],mn[r-(<<m)+][m]);
return a-b;
}
int main(){
int i,l,r;
int T,C,L,R;
scanf("%d%d",&n,&q);
for(i = ;i <= n;i++)
scanf("%d",&h[i]);
rmq_init();
while(q--){
scanf("%d%d",&L,&R);
printf("%d\n",rmq(L,R));
}
return ;
}

最新文章

  1. Linux文件(区域)锁函数 -- open()、fcntl()
  2. iOS学习24之UIControl及其子类
  3. for循环使用详解(c语言版)
  4. 锋利的jQuery-4--$(document).ready()和window.onload方法的区别
  5. Unix时间戳(Unix timestamp)转换工具
  6. SQL server 表之间的关系生成图
  7. 《Java程序设计》第七周学习总结
  8. 亲测 logminer挖掘
  9. linux umask使用详解
  10. Spring的lazy-init详解
  11. dropdownlist 二级联动
  12. 基于visual Studio2013解决C语言竞赛题之1094纵横图
  13. 搭建 Linux 下 GitLab 服务器(转)
  14. 【noip模拟】Fantasia
  15. static class 静态类(Java)
  16. python-第一类对象,闭包,迭代器
  17. Log4J &amp; elk 事故总结
  18. PAT甲题题解-1107. Social Clusters (30)-PAT甲级真题(并查集)
  19. Centos7下安装zabbix 3.0.19
  20. KNOCKOUTJS DOCUMENTATION-绑定(BINDINGS)-自定义绑定

热门文章

  1. Codeforces Round #362 (Div. 2)-&gt;A. Pineapple Incident
  2. Linux下tcp协议socket的recv函数返回时机分析(粘包)
  3. 【Entity Framework】 Entity Framework资料汇总
  4. LA 4384
  5. JsRender系列demo(2)多模板-template
  6. django --fields.E304 错误解决方案
  7. Oracle 9 - 分析undo和snapshot too old错误
  8. 关于in与exists的效率讨论
  9. spring @bean注解
  10. 本人arcgis api for javascript中常见错误总结