此题可用线段树来解决,标准线段树模板
#include <bits/stdc++.h>
using namespace std;
const int total=1e5+7;
int a[5*total];
struct node{
int mx;
int mi;
}tree[total*20];
void build(int u,int l,int r){
if(l==r){tree[u].mx=a[l],tree[u].mi=a[l];return;}
int mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
tree[u].mx=max(tree[u*2].mx,tree[u*2+1].mx);
tree[u].mi=min(tree[u*2].mi,tree[u*2+1].mi);
}
int query_max(int u,int ll,int rr,int l,int r){
if(ll>=l && rr<=r)return tree[u].mx;
int mid=(ll+rr)/2;
int tem1=INT_MIN,tem2=INT_MIN;
if(l<=mid)tem1=query_max(u*2,ll,mid,l,r);
if(mid<r)tem2=query_max(u*2+1,mid+1,rr,l,r);
return max(tem1,tem2);
}
int query_min(int u,int ll,int rr,int l,int r){
if(ll>=l && rr<=r)return tree[u].mi;
int mid=(ll+rr)/2;
int tem1=INT_MAX,tem2=INT_MAX;
if(l<=mid)tem1=query_min(u*2,ll,mid,l,r);
if(mid<r)tem2=query_min(u*2+1,mid+1,rr,l,r);
return min(tem1,tem2);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n,q;cin>>n>>q;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(q--){
int op,l,r;
cin>>op>>l>>r;
if(op==1)cout<<query_min(1,1,n,l,r)<<endl;
if(op==2)cout<<query_max(1,1,n,l,r)<<endl;
}
}

京公网安备 11010502036488号