您的线段数树打的有点别扭,不用设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