Description
洞窟里有一道长长的通道.它由N(1≤N≤25000)段道尾相连构成,编号分别为1到N.每个通道有一个阈值,其范围在[1,10^9]依次通过i..j的通道,那奶牛的体重指数就不能超过i..j通道中阈值的最小值.贝茜有Q(1≤Q≤25000)个问题,想请教你由i到j的通道的阈值的最小值.
Input
第1行输入N和Q,接下来N行输入每个通道的阈值,之后Q行每行两个整数,对应问题中的i和j(i<j).
Output
对于每个问题,输出其结果.
Sample Input
10 4
75
30
100
38
50
51
52
20
81
5
1 10
3 5
6 9
8 10
75
30
100
38
50
51
52
20
81
5
1 10
3 5
6 9
8 10
Sample Output
5
38
20
5
38
20
5
HINT
Source
显然是裸的RMQ。。。
第一篇博客庆祝一下中秋节
没事闲的又打了一下线段树。。
也是第一个线段树吧
/**************************************************************
Problem: 3381
User: tangyunkai1
Language: C++
Result: Accepted
Time:120 ms
Memory:2852 kb
****************************************************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int dp[25005][16];
int main ()
{
int n,q;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
scanf("%d",&dp[i][0]);
}
for(int j=1;j<=15;j++)
{
for(int i=1;i<=n;i++)
{
if(i-1+(1<<j)>n) break;
dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
//printf("%d %d %d\n",i,i-1+(1<<j),dp[i][j]);
}
}
for(int i=1;i<=q;i++)
{
int l,r;
scanf("%d%d",&l,&r);
int len=r-l+1;
int j;
for(j=1;j<=15;j++)
{
if((1<<j)>len) break;
}
j-=1;
int ans=min(dp[l][j],dp[r-(1<<j)+1][j]);
printf("%d\n",ans);
}
return 0;
}
/*
10 4
75 30 100 38 50 51 52 20 81 5
1 10
3 5
6 9
8 10
*/
/**************************************************************
Problem: 3381
User: tangyunkai1
Language: C++
Result: Accepted
Time:136 ms
Memory:2576 kb
****************************************************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
struct nodesegtree
{
int l;
int r;
int min_val;
}segtree[100005];
int a[30005];
void build(int l,int r,int num)
{
segtree[num].l=l;
segtree[num].r=r;
if(l==r)
{
segtree[num].min_val=a[l];
return ;
}
int mid=(l+r)>>1;
build(l,mid,num*2);
build(mid+1,r,num*2+1);
segtree[num].min_val=min(segtree[num*2].min_val,segtree[num*2+1].min_val);
}
int ans;
void minn(int x,int y,int num)
{
int l=segtree[num].l;
int r=segtree[num].r;
if(l>=x&&r<=y)
{
ans=min(ans,segtree[num].min_val);
}
else if(y>=l&&x<=r)
{
minn(x,y,num*2);
minn(x,y,num*2+1);
}
}
int main ()
{
int n,q;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
build(1,n,1);
for(int i=1;i<=q;i++)
{
int x,y;
scanf("%d%d",&x,&y);
ans=999999999;
minn(x,y,1);
printf("%d\n",ans);
}
return 0;
}