#include <bits/stdc++.h>
using namespace std;
const int N = 3e6+10;
int q,n;
int a[N];
int mx[N],mn[N];
void up(int i)
{
mx[i] = max(mx[i<<1],mx[i<<1|1]);
mn[i] = min(mn[i<<1],mn[i<<1|1]);
}
int get_mn(int jobl,int jobr,int l,int r,int i)
{
if(jobl<=l&&jobr>=r)
{
return mn[i];
}
else
{
int mid = (l+r)>>1;
int ans = INT_MAX;
if(mid>=jobl)
{
ans = min(ans,get_mn(jobl,jobr,l,mid,i<<1));
}
if(mid<jobr)
{
ans = min(ans,get_mn(jobl,jobr,mid+1,r,i<<1|1));
}
return ans;
}
}
int get_mx(int jobl,int jobr,int l,int r,int i)
{
if(jobl<=l&&jobr>=r)
{
return mx[i];
}
else
{
int mid = (l+r)>>1;
int ans = INT_MIN;
if(mid>=jobl)
{
ans = max(ans,get_mx(jobl,jobr,l,mid,i<<1));
}
if(mid<jobr)
{
ans = max(ans,get_mx(jobl,jobr,mid+1,r,i<<1|1));
}
return ans;
}
}
void build(int l,int r,int i)
{
if(l==r)
{
mx[i]=mn[i]=a[l];
}
else
{
int mid = (l+r)>>1;
build(l,mid,i<<1);
build(mid+1,r,i<<1|1);
up(i);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,n,1);
while(q--)
{
int op,l,r;
cin>>op>>l>>r;
if(op==1)
{
cout<<get_mn(l,r,1,n,1)<<'\n';
}
else
{
cout<<get_mx(l,r,1,n,1)<<'\n';
}
}
return 0;
}
线段树板子

京公网安备 11010502036488号