首页 > 其他 > 详细

AOJ DSL_2_A Range Minimum Query (RMQ)

时间:2016-12-17 11:30:29      阅读:342      评论:0      收藏:0      [点我收藏+]

Range Minimum Query (RMQ)

Write a program which manipulates a sequence A = {a0,a1,...,an−1} with the following operations:

  • find(s,t): report the mimimum element in as,as+1,...,at.
  • update(i,x): change ai to x.

Note that the initial values of ai (i=0,1,...,n−1) are 231-1.

Input

n q
com0 x0 y0
com1 x1 y1
...
comq−1 xq−1 yq−1

In the first line, n (the number of elements in A) and q (the number of queries) are given. Then, q queries are given where com represents the type of queries. ‘0‘ denotes update(xi,yi) and ‘1‘ denotes find(xi,yi).

Output

For each find operation, print the minimum element.

Constraints

  • 1≤n≤100000
  • 1≤q≤100000
  • If comi is 0, then 0≤xi<n, 0≤yi<231−1.
  • If comi is 1, then 0≤xi<n, 0≤yi<n.

Sample Input 1

3 5
0 0 1
0 1 2
0 2 3
1 0 2
1 1 2

Sample Output 1

1
2

 

Sample Input 2

1 3
1 0 0
0 0 5
1 0 0

Sample Output 2

2147483647
5

 
 

带修改的区间最小值查询,线段树模板题。压了压常数,又打榜了。

 

 1 #include <cstdio>
 2 
 3 inline int min(const int &a, const int &b) {
 4     return a < b ? a : b;
 5 }
 6 
 7 #define siz 10000000
 8 
 9 char buf[siz], *bit = buf;
10 
11 inline int nextInt(void) {
12     register int ret = 0;
13     register int neg = false;
14     
15     for (; *bit < 0; ++bit)
16         if (*bit == -)neg ^= true;
17     
18     for (; *bit >= 0; ++bit)
19         ret = ret * 10 + *bit - 0;
20     
21     return neg ? -ret : ret;
22 }
23 
24 #define inf 2147483647
25 
26 int n, m, mini[400005];
27 
28 int find(int t, int l, int r, int x, int y) {
29     if (x <= l && r <= y)
30         return mini[t];
31     int mid = (l + r) >> 1;
32     if (y <= mid)
33         return find(t << 1, l, mid, x, y);
34     if (x > mid)
35         return find(t << 1 | 1, mid + 1, r, x, y);
36     else
37         return min(
38             find(t << 1, l, mid, x, mid),
39             find(t << 1 | 1, mid + 1, r, mid + 1, y)
40         );
41 }
42 
43 void update(int t, int l, int r, int x, int y) {
44     if (l == r)mini[t] = y;
45     else {
46         int mid = (l + r) >> 1;
47         if (x <= mid)
48             update(t << 1, l, mid, x, y);
49         else
50             update(t << 1 | 1, mid + 1, r, x, y);
51         mini[t] = min(mini[t << 1], mini[t << 1 | 1]);
52     }
53 }
54 
55 signed main(void) {
56     fread(buf, 1, siz, stdin);
57 
58     n = nextInt();
59     m = nextInt();
60 
61     for (int i = 0; i <= (n << 2); ++i)mini[i] = inf;
62 
63     for (int i = 1; i <= m; ++i) {
64         int c = nextInt();
65         int x = nextInt();
66         int y = nextInt();
67         if (c)    // find(x, y)
68             printf("%d\n", find(1, 1, n, x + 1, y + 1));
69         else    // update(x, y)
70             update(1, 1, n, x + 1, y);
71     }
72 
73 //    system("pause");
74 }

 

@Author: YouSiki

AOJ DSL_2_A Range Minimum Query (RMQ)

原文:http://www.cnblogs.com/yousiki/p/6189185.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!