线段树求最大值求卡常
  • 板块灌水区
  • 楼主火羽白日生
  • 当前回复8
  • 已保存回复8
  • 发布时间2021/1/13 14:43
  • 上次更新2023/11/5 04:52:37
查看原帖
线段树求最大值求卡常
226113
火羽白日生楼主2021/1/13 14:43

rt

#include<bits/stdc++.h>

using namespace std;

inline int read(){
	int w=0,f=1; char ch;
	while(!isdigit(ch=getchar())) if(ch=='-') f=-1;
	while(isdigit(ch)){
		w=(w<<3)+(w<<1)+(ch^48);
		ch=getchar();
	}
	return w*f;
}

int n,q;
int a[100005],t[400005];
inline int ls(int p){
	return p<<1;
}
inline int rs(int p){
	return p<<1|1;
}
void pushup(int p){
	t[p]=max(t[ls(p)],t[rs(p)]);
}
void build(int p,int l,int r){
	if(l==r){
		t[p]=max(t[p],a[l]);
		return;
	}
	int mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	pushup(p);
}
int query(int p,int l,int r,int tl,int tr){
	int res=-1e9;
	if(tl<=l&&r<=tr)
		return t[p];
	int mid=(l+r)>>1;
	if(tl<=mid)
		res=max(res,query(ls(p),l,mid,tl,tr));
	if(tr>mid)
		res=max(res,query(rs(p),mid+1,r,tl,tr));
	return res;
}

int main(){
	n=read();
	n++;
	for(int i=1;i<=n;i++) a[i]=read();
	build(1,1,n);
	q=read();
	for(int i=1;i<=q;i++){
		int x=read(),y=read();
		printf("%d\n",query(1,1,n,x+1,y+1));
	}
	return 0;
}
2021/1/13 14:43
加载中...