想练习个线段树,但是是T掉了,求助!感谢所有提供建议的大佬!!
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
#define ll long long
const ll maxn = 100010;
ll n,m,x,y,k,ans;
struct node{
ll r,l,w,f;
}tree[4*maxn+1];
inline int read(){
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void build(ll l,ll r,ll k){
tree[k].l=l;
tree[k].r=r;
if(l==r){
cin>>tree[k].w;
return;
}
ll m=(l+r)>>1;
build(l,m,k*2);
build(m+1,r,k*2+1);
tree[k].w=max(tree[k*2].w,tree[k*2+1].w);
}
void cx(ll x,ll y,ll k){
if(tree[k].l>=x&&tree[k].r<=y){
ans=max(ans,tree[k].w);
return;
}
ll m=(tree[k].l+tree[k].r)>>1;
if(x<=m) cx(x,y,k*2);
if(y>m) cx(x,y,k*2+1);
}
int main(){
cin>>n>>m;
build(1,n,1);
while(m--){
ans=0;
x=read();
y=read();
cx(x,y,1);
cout<<ans<<endl;
}
return 0;
}