线段树求助

P1816 忠诚

您的线段数树打的有点别扭,不用设ox3f3f3f3f的而且查找函数没有那么复杂
by CSH8 @ 2018-05-24 17:45:12


```cpp #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int maxn=1e5+6; #define REG register #define min(a,b) a<b?a:b int m,n,data[maxn],x,y; queue<int> q; struct Segment_Tree{ #define l(s) s<<1 #define r(s) s<<1|1 struct Segment_Tree_Node{ int val; }s[maxn<<2]; inline void clear() { for(REG int i=1;i<=(maxn<<2);i++) s[i].val=0; return; } inline void push_up(REG int top) { s[top].val=min(s[l(top)].val,s[r(top)].val); return; } inline void built(REG int top,REG int l,REG int r) { if(l==r){ s[top].val=data[l]; return; } int mid=(l+r)>>1; built(l(top),l,mid); built(r(top),mid+1,r); push_up(top); return; } inline int Query(REG int top,REG int l,REG int r,REG int Query_l,REG int Query_r) { if(l>Query_r||r<Query_l) return 0; if(l<=Query_l&&r>=Query_r) return s[top].val; int mid=(l+r)>>1; if(Query_l<=mid) return Query(l(top),l,mid,Query_l,Query_r); if(Query_r>mid) return Query(r(top),mid+1,r,Query_l,Query_r); return min(Query(l(top),l,mid,Query_l,Query_r),Query(r(top),mid+1,r,Query_l,Query_r)); } #undef l #undef r }lwd; int main() { scanf("%d %d",&m,&n); for(REG int i=1;i<=m;i++) scanf("%d",&data[i]); lwd.built(1,1,n); for(REG int i=1;i<=n;i++) { scanf("%d %d",&x,&y); q.push(lwd.Query(1,1,m,x,y)); } while(!q.empty()) { printf("%d",q.front()); q.pop(); putchar(32); } return 0; } ```
by Explorer_CYC @ 2018-06-05 21:33:45


|