| ||||||||||
| 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 | |||||||||
Re:水水水水水水水水水水In Reply To:水水水水水水水水水水 Posted by:ty21 at 2018-08-03 18:03:11 > //线段树大大大大水题
>
> #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