线段树做法:
需要使用卡常**!!!
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<queue>
- #include<map>
- #include<vector>
- #include<string>
- #include<cstring>
- #include<stack>
- using namespace std;
- inline int read()
- {
- int num=0,w=1;
- char ch=getchar();
- while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
- while(ch>='0'&&ch<='9') {num=(num<<1)+(num<<3)+ch-'0';ch=getchar();}
- return num*w;
- }
- struct node
- {
- int l;
- int r;
- int maxx;
- }tree[1000001];
- int n,m,x,y;
- int a[1000001];
- inline void add(int k)
- {
- tree[k].maxx=max(tree[k<<1].maxx,tree[k<<1|1].maxx);
- }
- inline void build(int k,int l,int r)
- {
- tree[k].l=l,tree[k].r=r;
- if(l==r) {tree[k].maxx=a[l];return;}
- int mid=(l+r)>>1;
- build(k<<1,l,mid);
- build(k<<1|1,mid+1,r);
- add(k);
- return;
- }
- inline int find(int k,int l,int r,int x,int y)
- {
- if(x<=l&&r<=y) return tree[k].maxx;
- int mid=(l+r)>>1;
- int res=-0x3f3f3f;
- if(x<=mid) res=max(res,find(k<<1,l,mid,x,y));
- if(y>mid) res=max(res,find(k<<1|1,mid+1,r,x,y));
- return res;
- }
- int main()
- {
- n=read(),m=read();
- for(register int i=1;i<=n;i++) a[i]=read();
- build(1,1,n);
- while(m--)
- {
- x=read(),y=read();
- printf("%d\n",find(1,1,n,x,y));
- }
- return 0;
- }
|