1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
#include<bits/stdc++.h> using namespace std; const int MAXN=1e5+10; int n,m,a[MAXN+10],val[(MAXN<<2)+10]; int ls(int i){return i<<1;} int rs(int i){return i<<1|1;} int read() { int x=0,f=1; char c=getchar(); while(!isdigit(c)){if(c=='-')f=-1;c=getchar();} while(isdigit(c)){x=x*10+c-'0',c=getchar();} return x*f; } void pushup(int pos) { val[pos]=max(val[ls(pos)],val[rs(pos)]); } void build(int pos,int l,int r) { if(l==r){val[pos]=a[l];return ;} int mid=l+((r-l)>>1); build(ls(pos),l,mid),build(rs(pos),mid+1,r); pushup(pos); } int query(int pos,int ql,int qr,int l,int r) { if(qr<l||ql>r)return INT_MIN; if(ql<=l&&r<=qr)return val[pos]; int mid=l+((r-l)>>1); return max(query(ls(pos),ql,qr,l,mid),query(rs(pos),ql,qr,mid+1,r)); } signed main() { n=read(),m=read(); for(int i=1;i<=n;i++)a[i]=read(); build(1,1,n); while(m--) { int l=read(),r=read(); cout<<query(1,l,r,1,n)<<'\n'; } return 0; }
|