#include<bits/stdc++.h>
using namespace std;constint N =1e5+10;int n, m, a[N];int f[N][20];//f[i][j]:a[i]...a[i + 2^j - 1]范围里的最小值 intmain(){scanf("%d%d",&n,&m);for(int i =1; i <= n; i ++){scanf("%d",&a[i]);
f[i][0]= a[i];}int t =log2(n);for(int j =1; j <= t; j ++){for(int i =1; i +(1<< j)-1<= n; i ++){int k = j -1;
f[i][j]=max(f[i][k], f[i +(1<< k)][k]);}}while(m --){int x, y;scanf("%d%d",&x,&y);int k =log2(y - x +1);int maxx =max(f[x][k], f[y +1-(1<< k)][k]);printf("%d\n", maxx);}return0;}
天才的记忆
#include<bits/stdc++.h>
using namespace std;constint N =2e5+10;int n, m, a[N];int f[N][20];//f[i][j]:a[i]...a[i + 2^j - 1]范围里的最小值 intmain(){scanf("%d",&n);for(int i =1; i <= n; i ++){scanf("%d",&a[i]);
f[i][0]= a[i];}int t =log2(n);for(int j =1; j <= t; j ++){for(int i =1; i +(1<< j)-1<= n; i ++){int k = j -1;
f[i][j]=max(f[i][k], f[i +(1<< k)][k]);}}scanf("%d",&m);while(m --){int x, y;scanf("%d%d",&x,&y);int k =log2(y - x +1);int maxx =max(f[x][k], f[y +1-(1<< k)][k]);printf("%d\n", maxx);}return0;}
最敏捷的机器人
#include<bits/stdc++.h>
using namespace std;constint N =1e5+10;int n, m, a[N];int f[N][20];//f[i][j]:a[i]...a[i + 2^j - 1]范围里的最大值 int g[N][20];//g[i][j]:a[i]...a[i + 2^j - 1]范围里的最小值 intmain(){scanf("%d%d",&n,&m);for(int i =1; i <= n; i ++){scanf("%d",&a[i]);
f[i][0]= a[i];
g[i][0]= a[i];}int t =log2(n);for(int j =1; j <= t; j ++){for(int i =1; i +(1<< j)-1<= n; i ++){
f[i][j]=max(f[i][j -1], f[i +(1<< j -1)][j -1]);
g[i][j]=min(g[i][j -1], g[i +(1<< j -1)][j -1]);}}for(int i =1; i <= n - m +1; i ++){//1 ~ m, 2 ~ m + 1,..., i ~ m + i - 1//(m + i - 1) - 1 << k + 1//int k =log2(m);int maxx =max(f[i][k], f[m + i -(1<< k)][k]);int minn =min(g[i][k], g[m + i -(1<< k)][k]);printf("%d %d\n", maxx, minn);}return0;}
Balanced Lineup
#include<bits/stdc++.h>
using namespace std;constint N =5e4+10;int n, Q, x;int f[N][20], g[N][20];//最矮,最高 intmain(){scanf("%d%d",&n,&Q);for(int i =1; i <= n; i ++){scanf("%d",&x);
f[i][0]= g[i][0]= x;}int t =log2(n);for(int j =1; j <= t; j ++){for(int i =1; i +(1<< j)-1<= n; i ++){int k = j -1;
f[i][j]=min(f[i][k], f[i +(1<< k)][k]);
g[i][j]=max(g[i][k], g[i +(1<< k)][k]);}}while(Q --){int a, b;scanf("%d%d",&a,&b);int k =log2(b - a +1);int minn =min(f[a][k], f[b +1-(1<< k)][k]);int maxx =max(g[a][k], g[b +1-(1<< k)][k]);printf("%d\n", maxx - minn);}return0;}