TYVJ1038 忠诚

hzw学长博客里的2048,根本停不下来!

 

 

描述

    老管家是一个聪明能干的人。他为财主工作了整整10年,财主为了让自已账目更加清楚。要 求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意。但是由于一些人的挑拨,财主还是对管家产生了怀疑。于是他决定用一种特别的方法来判 断管家的忠诚,他把每次的账目按1,2,3…编号,然后不定时的问管家问题,问题是这样的:在a到b号账中最少的一笔是多少?为了让管家没时间作假他总是 一次问多个问题。

输入格式

输入中第一行有两个数m,n表示有m(m<=100000)笔账,n表示有n个问题,n<=100000。
第二行为m个数,分别是账目的钱数
后面n行分别是n个问题,每行有2个数字说明开始结束的账目编号。

输出格式

输出文件中为每个问题的答案。具体查看样例。

测试样例1

输入

10 3
1 2 3 4 5 6 7 8 9 10
2 7
3 9
1 10

输出

2 3 1

裸线段树维护最小值。连线段树的完全体都不用写


 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #define ls l,mid,rt<<1
 6 #define rs mid+1,r,(rt<<1)|1
 7 using namespace std;
 8 const int mxn=110000;
 9 const int inf=10000000;
10 int mini[mxn*4];
11 int data[mxn];
12 int n,m;
13 void Build(int l,int r,int rt){
14     if(l==r){
15         mini[rt]=data[l];
16         return;
17     }
18     int mid=(l+r)>>1;
19     Build(ls);
20     Build(rs);
21     mini[rt]=min(mini[rt<<1],mini[rt<<1 |1]);
22     return;
23 }
24 int query(int L,int R,int l,int r,int rt){
25     if(L<=l && r<=R)return mini[rt];
26     int mid=(l+r)>>1;
27     int ans=inf;
28     if(L<=mid)ans=min(ans,query(L,R,ls));
29     if(R>mid)ans=min(ans,query(L,R,rs));
30     return ans;
31 }
32 int main(){
33     scanf("%d%d",&n,&m);
34     int i,j;
35     
36     for(i=1;i<=n;i++){
37         scanf("%d",&data[i]);
38     }
39 
40     Build(1,n,1);
41     int x,y;
42     for(i=1;i<=m;i++){
43         scanf("%d%d",&x,&y);
44         printf("%d ",query(x,y,1,n,1));
45     }
46     return 0;
47 }

 



 

posted @ 2016-07-07 10:22  SilverNebula  阅读(214)  评论(0编辑  收藏  举报
AmazingCounters.com