线段树93分TLE求条!!!
查看原帖
线段树93分TLE求条!!!
1260091
_people楼主2024/8/23 15:50
#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int ret=0;
	char ch=' ',c=getchar();
	while(!('0'<=c&&c<='9')) ch=c,c=getchar();
	while('0'<=c&&c<='9') ret=(ret<<1)+(ret<<3)+c-'0',c=getchar();
	return ch=='-'?-ret:ret;
}
int n,m;
int a[100010];
struct NODE{
	int l,r,ma;
};
NODE tr[400010];
void pushup(int u){
	tr[u].ma=max(tr[u<<1].ma,tr[u<<1|1].ma);
}
void pushup(NODE &root,NODE &zuo,NODE &you){
	root.ma=max(zuo.ma,you.ma);
}
void build(int u,int l,int r){
	if(l==r){
		tr[u]=(NODE){l,r,a[l]};
		return;
	}
	tr[u]=(NODE){l,r};
	int mid=(l+r)/2;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}
NODE query(int u,int l,int r){
	if(tr[u].l>=l&&tr[u].r<=r) return tr[u];
	NODE ans;
	int mid=(tr[u].l+tr[u].r)/2;
	if(mid<l) ans=query(u<<1|1,l,r);
	else if(mid>=r) ans=query(u<<1,l,r);
	else{
		NODE zuo=query(u<<1,l,r);
		NODE you=query(u<<1|1,l,r);
		pushup(ans,zuo,you);
	}
	return ans;
}
int main(){
	n=read();
	m=read();
	for(int i=1;i<=n;i++) a[i]=read();
	build(1,1,n);
	while(m--){
		int x,y;
		x=read();
		y=read();
		printf("%d\n",query(1,x,y).ma);
	}
	return 0;
}
2024/8/23 15:50
加载中...