Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
水水水水水水水水水水//线段树大大大大水题 #include <cstdio> #include <algorithm> using namespace std; const int maxn =5e4; const int inf =1e7; struct { int l,r; int ma,mi; }tree[maxn*4+10]; void update(int x) { if(tree[x].l==tree[x].r) return; tree[x].ma=max(tree[x*2].ma,tree[x*2+1].ma); tree[x].mi=min(tree[x*2].mi,tree[x*2+1].mi); } void build(int x,int l,int r) { tree[x].l=l; tree[x].r=r; if(l==r) { int w; scanf("%d",&w); tree[x].ma=tree[x].mi=w; } else { int mid=(l+r)/2; build(x*2,l,mid); build(x*2+1,mid+1,r); update(x); } } int getmax(int x,int l,int r) { if(l<=tree[x].l&&r>=tree[x].r) return tree[x].ma; else { int res=0; int mid=(tree[x].l+tree[x].r)/2; if(l<=mid) res=max(res,getmax(x*2,l,r)); if(r>mid) res=max(res,getmax(x*2+1,l,r)); return res; } } int getmin(int x,int l,int r) { if(l<=tree[x].l&&r>=tree[x].r) return tree[x].mi; else { int res=inf; int mid=(tree[x].l+tree[x].r)/2; if(l<=mid) res=min(res,getmin(x*2,l,r)); if(r>mid) res=min(res,getmin(x*2+1,l,r)); return res; } } int main() { int n,m; scanf("%d%d",&n,&m); build(1,1,n); while(m--) { int ll,rr; scanf("%d%d",&ll,&rr); //printf("%d %d\n",getmax(1,ll,rr),getmin(1,ll,rr)); printf("%d\n",getmax(1,ll,rr)-getmin(1,ll,rr)); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator