线段树的最值问题(复习代码) 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)<<" "; } }