洛谷P3865
注意:位运算一定要加括号!因为他的优先级没有加减法高;
注意在预处理的时候判断的是前一个区间是否完整,故 i+(1<<(j-1))-1<=n;
取logn时最好多加一位,以保漏掉数字
与LCA要分清!
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define man 100010 4 inline int read() 5 { 6 int s=0,f=1;char c=getchar(); 7 while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} 8 while(c>='0'&&c<='9'){s=s*10+c-'0';c=getchar();} 9 return s*f; 10 } 11 int f[man][30],logn; 12 int n,m; 13 inline int rmq(int x,int y) 14 { int k=(int)(log(y-x+1.0)/log(2.0)); 15 return max(f[x][k],f[y-(1<<k)+1][k]); 16 } 17 int main() 18 { n=read();m=read(); 19 for(int i=1;i<=n;i++) 20 f[i][0]=read(); 21 logn=(int)(log(n)/log(2.0))+1; 22 for(int j=1;j<=logn;j++) 23 for(int i=1;i<=n;i++) 24 if(i+(1<<(j-1))-1<=n) 25 f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]); 26 for(int i=1;i<=m;i++) 27 { int x,y; 28 x=read();y=read(); 29 printf("%d ",rmq(x,y)); 30 } 31 return 0; 32 }