线段树的最值问题(复习代码) cogs 忠诚

区间和
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
inline int read(){
    int num=0,f=1; char c=getchar();
    while(!isdigit(c)){if(c=='-') f=-1; c=getchar();}
    while(isdigit(c)){num=(num<<1)+(num<<3)+(c^48); c=getchar();}
    return num*f;
}
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 100010
int sum[maxn<<1],a[maxn];
inline void update(int rt){
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int l,int r,int rt){
    if(l==r){
        sum[rt]=a[l]; return;
    }
    int m=(l+r)>>1;
    build(lson); build(rson);
    update(rt);
}
int ask(int l,int r,int rt,int nl,int nr){
    if(nl<=l and nr>=r) return sum[rt];
    int m=(l+r)>>1,ans=0;
    if(nl<=m) ans+=ask(lson,nl,nr);
    if(nr>m)  ans+=ask(rson,nl,nr);
    return ans;
}
int main(){
    int n,m;
    n=read(); m=read();
    for(int i=1;i<=n;i++) a[i]=read();
    build(1,n,1);
    for(int i=1;i<=m;i++){
        int x,y;
        x=read(); y=read(); 
        cout<<ask(1,n,1,x,y)<<'\n';
    }
}

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
inline int read(){
    int num=0,f=1; char c=getchar();
    while(!isdigit(c)){if(c=='-') f=-1; c=getchar();}
    while(isdigit(c)){num=(num<<1)+(num<<3)+(c^48); c=getchar();}
    return num*f;
}
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 100010
int s[maxn<<1],a[maxn];
inline void update(int rt){
    s[rt]=max(s[rt<<1],s[rt<<1|1]);
}
void build(int l,int r,int rt){
    if(l==r){
        s[rt]=a[l]; return;
    }
    int m=(l+r)>>1;
    build(lson); build(rson);
    update(rt);
}
int ask(int l,int r,int rt,int nl,int nr){
    if(nl<=l and nr>=r) return s[rt];
    int m=(l+r)>>1,ans=-1;
    if(nl<=m) ans=max(ans,ask(lson,nl,nr));
    if(nr>m)  ans=max(ans,ask(rson,nl,nr));
    return ans;
}
int main(){
    int n,m;
    n=read(); m=read();
    for(int i=1;i<=n;i++) a[i]=read();
    build(1,n,1);
    for(int i=1;i<=m;i++){
        int x,y;
        x=read(); y=read();
        cout<<ask(1,n,1,x,y)<<" ";
    }
}

 

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
inline int read(){
    int num=0,f=1; char c=getchar();
    while(!isdigit(c)){if(c=='-') f=-1; c=getchar();}
    while(isdigit(c)){num=(num<<1)+(num<<3)+(c^48); c=getchar();}
    return num*f;
}
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 100010
int s[maxn<<1],a[maxn];
inline void update(int rt){
    s[rt]=min(s[rt<<1],s[rt<<1|1]);
}
void build(int l,int r,int rt){
    if(l==r){
        s[rt]=a[l]; return;
    }
    int m=(l+r)>>1;
    build(lson); build(rson);
    update(rt);
}
int ask(int l,int r,int rt,int nl,int nr){
    if(nl<=l and nr>=r) return s[rt];
    int m=(l+r)>>1,ans=1e9;
    if(nl<=m) ans=min(ask(lson,nl,nr),ans);
    if(nr>m)  ans=min(ask(rson,nl,nr),ans);
    return ans;
}
int main(){
    int n,m;
    n=read(); m=read();
    for(int i=1;i<=n;i++) a[i]=read();
    build(1,n,1);//¼ÇµÃ½¨Ê÷ 
    for(int i=1;i<=m;i++){
        int x,y;
        x=read(); y=read();
        cout<<ask(1,n,1,x,y)<<" ";
    }
}

 

 

posted @ 2017-11-07 07:09  TimDucan  阅读(149)  评论(0编辑  收藏  举报