线段树求调
查看原帖
线段树求调
539495
what_else楼主2022/6/1 12:59

#include<bits/stdc++.h>
using namespace std;
#define MAXN 320100
int n,m;
int a[MAXN],d[MAXN*2+1],d2[MAXN*2+1];
void build(int s,int t,int p){
	if(s==t){d[p]=a[s];d2[p]=a[s];return;}
	int m=s+((t-s)>>1);
	build(s,m,p*2);
	build(m+1,t,p*2+1);
	d[p]=max(d[p*2],d[(p*2)+1]);
	d2[p]=min(d2[p*2],d2[(p*2)+1]);
}
int getmax(int l,int r,int s,int t,int p){
	if(l<=s&&t<=r)return d[p];
	int m=s+((t-s)>>1);
	int sum=-1;
	if(l<=m)sum=max(sum,getmax(l,r,s,m,p*2));
	if(r>m)sum=max(sum,getmax(l,r,m+1,t,p*2+1));
	return sum;
}
int getmin(int l,int r,int s,int t,int p){
	if(l<=s&&t<=r)return d2[p];
	int m=s+((t-s)>>1);
	int sum=MAXN;
	if(l<=m)sum=min(sum,getmin(l,r,s,m,p*2));
	if(r>m)sum=min(sum,getmin(l,r,m+1,t,p*2+1));
	return sum;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	build(1,n,1);
	for(int i=1;i<=m;i++){
		int l,r;
		cin>>l>>r;
		cout<<getmax(l,r,1,n,1)-getmin(l,r,1,n,1)<<endl;
	}
}

2022/6/1 12:59
加载中...