Balanced Lineup -最值之差
阿新 • • 發佈:2018-12-13
#include<iostream> #include<stdio.h> #include<cstdio> using namespace std; #define ll long long #define inf 0x7f7f7f7f const int maxn=500050; struct node { ll l,r,minn,maxx; ll mid() { return (l+r)/2; } } tree[maxn*4]; ll mi,ma,n,q,x,y; void init(ll root,ll l,ll r) { tree[root].l=l; tree[root].r=r; if(l==r) { tree[root].maxx=-inf; tree[root].minn=inf; return ; } init(root*2,l,tree[root].mid()); init(root*2+1,tree[root].mid()+1,r); tree[root].maxx=max(tree[root*2].maxx,tree[root*2+1].maxx); tree[root].minn=min(tree[root*2].minn,tree[root*2+1].minn); } void updata(ll root,ll l,ll ad) { if(tree[root].l==l&&tree[root].r==l) { tree[root].maxx=tree[root].minn=ad; return ; } if(l>tree[root].mid()) updata(root*2+1,l,ad); else updata(root*2,l,ad); tree[root].maxx=max(tree[root*2].maxx,tree[root*2+1].maxx); tree[root].minn=min(tree[root*2].minn,tree[root*2+1].minn); } void query(ll root,ll l,ll r) { if(tree[root].l==l&&tree[root].r==r) { mi=min(tree[root].minn,mi); ma=max(tree[root].maxx,ma); return ; } if(l>tree[root].mid()) query(root*2+1,l,r); else if(r<=tree[root].mid()) query(root*2,l,r); else { query(root*2,l,tree[root].mid()); query(root*2+1,tree[root].mid()+1,r); } } int main() { while(~scanf("%lld%lld",&n,&q)) { init(1,1,n); for(int i=1; i<=n; i++) { scanf("%lld",&x); updata(1,i,x); } while(q--) { ma=-inf; mi=inf; scanf("%lld%lld",&x,&y); query(1,x,y); printf("%lld\n",ma-mi); } } return 0; }