[Luogu1816]忠诚
线段树区间最小值。。当然RMQ才是正解。。。(听说可以写待修改莫队,不过平衡树乱搞貌似速度会更快)
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdlib> 5 #include <map> 6 #include <string> 7 #include <vector> 8 #include <stack> 9 #include <cmath> 10 #include <queue> 11 #include <cstdio> 12 using namespace std; 13 14 const int N=200000; 15 16 int n,m,a[N<<4],l,r,M=1; 17 int main(){ 18 scanf("%d%d",&n,&m); 19 memset(a,0x3f,sizeof a); 20 while(M<n)M<<=1; 21 for(int i=M+1;i<=M+n;i++)scanf("%d",&a[i]); 22 for(int i=M-1;i;i--)a[i]=min(a[i<<1],a[i<<1|1]); 23 for(int i=1;i<=m;i++){ 24 scanf("%d%d",&l,&r); 25 int ans=0x3f3f3f3f; 26 for(l+=M-1,r+=M+1;l^r^1;l>>=1,r>>=1){ 27 if(~l&1)ans=min(ans,a[l^1]); 28 if(r&1)ans=min(ans,a[r^1]); 29 } 30 printf("%d ",ans); 31 } 32 }