老管家是一个聪明能干的人。他为财主工作了整整 10 年。财主为了让自已账目更加清楚,要求管家每天记 k 次账。由于管家聪明能干,因而管家总是让财主十分满意。但是由于一些人的挑拨,财主还是对管家产生了怀疑。于是他决定用一种特别的方法来判断管家的忠诚,他把每次的账目按 1, 2, 3 … 编号,然后不定时的问管家问题,问题是这样的:在 a 到 b 号账中最少的一笔是多少?为了让管家没时间作假,他总是一次问多个问题。
输入中第一行有两个数 m, n 表示有 m 笔账 n 表示有 n 个问题。
第二行为 m 个数,分别是账目的钱数。
后面 n 行分别是 n 个问题,每行有 2 个数字说明开始结束的账目编号。
在一行中输出每个问题的答案,以一个空格分割。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int n,m; 5 int f[100100][50]; 6 int l,r; 7 8 int main() 9 { 10 scanf("%d%d",&n,&m); 11 for (int i=1;i<=n;i++) 12 scanf("%d",&f[i][0]); 13 for (int j=1;(1<<j)<=n;j++) 14 for (int i=1;i+(1<<j)-1<=n;i++) 15 f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]); 16 17 while (m--) 18 { 19 scanf("%d%d",&l,&r); 20 int k=log2(r-l+1); 21 int sum=min(f[l][k],f[r-(1<<k)+1][k]); 22 printf("%d ",sum); 23 } 24 return 0; 25 }