来自kuangbin模板
#include <bits/stdc++.h>
#define N 1010
#define mem(a,x) memset(a,x,sizeof a)
using namespace std;
#define INF 0x3f3f3f3f
const double eps = 1e-8;
typedef long long ll;
const int MAXN = 50010;
int dpmin[MAXN][20];
int dpmax[MAXN][20];
int mm[MAXN];
int mi[MAXN];
void initRMQ(int n,int b[]){
mm[0] = -1;
for(int i=1;i<=n;i++){
mm[i] = ((i&(i-1))== 0 )? mm[i-1]+1: mm[i-1];
dpmin[i][0] = dpmax[i][0] = b[i];
}
for(int j=1;j<=mm[n];j++)
for(int i=1;i+(1<<j)-1 <=n;i++){
dpmax[i][j] = max(dpmax[i][j-1] , dpmax[i+(1<<(j-1))][j-1]);
dpmin[i][j] = min(dpmin[i][j-1] , dpmin[i+(1<<(j-1))][j-1]);
}
}
int rmqmax(int x,int y){
int k = mm[y-x+1];
return max(dpmax[x][k], dpmax[y-(1<<k)+1][k]);
}
int rmqmin(int x,int y){
int k = mm[y-x+1];
return min(dpmin[x][k], dpmin[y-(1<<k)+1][k]);
}
int arr[MAXN];
int main(){
int n;
int t;scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&arr[i]);
initRMQ(n,arr);
int q;scanf("%d",&q);
while(q--){
int a,b,c;scanf("%d%d%d",&c,&a,&b);
if(c == 1)
printf("%d\n",rmqmin(a,b));
else if(c == 2)
printf("%d\n",rmqmax(a,b));
else
printf("%d\n",rmqmax(a,b)+rmqmin(a,b));
}
}
return 0;
}