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<n0≤yi<231−1.
  • If comi is 1, then 0≤xi<n0≤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

 
 

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

 #include <cstdio>

 inline int min(const int &a, const int &b) {
return a < b ? a : b;
} #define siz 10000000 char buf[siz], *bit = buf; inline int nextInt(void) {
register int ret = ;
register int neg = false; for (; *bit < ''; ++bit)
if (*bit == '-')neg ^= true; for (; *bit >= ''; ++bit)
ret = ret * + *bit - ''; return neg ? -ret : ret;
} #define inf 2147483647 int n, m, mini[]; int find(int t, int l, int r, int x, int y) {
if (x <= l && r <= y)
return mini[t];
int mid = (l + r) >> ;
if (y <= mid)
return find(t << , l, mid, x, y);
if (x > mid)
return find(t << | , mid + , r, x, y);
else
return min(
find(t << , l, mid, x, mid),
find(t << | , mid + , r, mid + , y)
);
} void update(int t, int l, int r, int x, int y) {
if (l == r)mini[t] = y;
else {
int mid = (l + r) >> ;
if (x <= mid)
update(t << , l, mid, x, y);
else
update(t << | , mid + , r, x, y);
mini[t] = min(mini[t << ], mini[t << | ]);
}
} signed main(void) {
fread(buf, , siz, stdin); n = nextInt();
m = nextInt(); for (int i = ; i <= (n << ); ++i)mini[i] = inf; for (int i = ; i <= m; ++i) {
int c = nextInt();
int x = nextInt();
int y = nextInt();
if (c) // find(x, y)
printf("%d\n", find(, , n, x + , y + ));
else // update(x, y)
update(, , n, x + , y);
} // system("pause");
}

@Author: YouSiki

AOJ DSL_2_A Range Minimum Query (RMQ)的更多相关文章

  1. Geeks - Range Minimum Query RMQ范围最小值查询

    使用线段树预处理.能够使得查询RMQ时间效率在O(lgn). 线段树是记录某范围内的最小值. 标准的线段树应用. Geeks上仅仅有两道线段树的题目了.并且没有讲到pushUp和pushDown操作. ...

  2. Range Minimum Query and Lowest Common Ancestor

    作者:danielp 出处:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAnc ...

  3. AOJ DSL_2_E Range Add Query (RAQ)

    Range Add Query 数列 A = {a1,a2,...,an} に対し.次の2つの操作を行うプログラムを作成せよ. add(s,t,x): as,as+1,...,at にxを加算する. ...

  4. AOJ DSL_2_D Range Update Query (RUQ)

    Range Update Query 数列 A = {a0,a1 ,...,an−1} に対し.次の2つの操作を行うプログラムを作成せよ. update(s,t,x): as,as+1,...,at  ...

  5. RMQ(Range Minimum Query)问题(转)

    问题描述 RMQ问题是求给定区间中的最值问题.对于长度为n的数列A,回答若干查询RMQ(A, i, j).返回数组A中下标在[i,j]里的最小值的下标. 比如数列 5,8,1,3,6,4,9,5,7 ...

  6. Segment Tree Range Minimum Query.

    int rangeMinQuery(int segTree[], int qlow, int qhigh, int low, int high, int pos) { if (qlow <= l ...

  7. RMQ (Range Minimal Query) 问题 ,稀疏表 ST

    RMQ ( 范围最小值查询 ) 问题是一种动态查询问题,它不需要修改元素,但要及时回答出数组 A 在区间 [l, r] 中最小的元素值. RMQ(Range Minimum/Maximum Query ...

  8. [LeetCode] Range Sum Query 2D - Mutable 二维区域和检索 - 可变

    Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...

  9. [LeetCode] Range Sum Query - Mutable 区域和检索 - 可变

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

随机推荐

  1. SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新

    下拉刷新和上拉刷新都用SwipeRefreshLayout 自带的进度条 布局 <?xml version="1.0" encoding="utf-8"? ...

  2. TextInputLayout setError() setErrorEnable()

    public void afterTextChanged(Editable s) { if (textInputLayout.getEditText().getText().toString().le ...

  3. 2015 MVP OpenDay 及 Community Camp 演讲PPT分享

    这两天来到首都北京参加一年一度的MVP OpenDay 和 MVP Community Camp.其中,31号下午有我的课程:What Will You Make: Windows IoT应用开发入门 ...

  4. MongoDB学习笔记~为IMongoRepository接口添加了增删改方法,针对官方驱动

    回到目录 上一讲说了MongoDB官方驱动的查询功能,这回说一下官方驱动的增删改功能,驱动在升级为2.0后,相应的insert,update和delete都只有了异步版本(或者叫并行版本),这当然也是 ...

  5. MongoDB学习笔记~关于官方驱动集成IQueryable之后的一些事

    回到目录 关于官方驱动集成IQueryable之后的一些事,有好事也有坏事,好事就是它会将你的linq语句非常友好的翻译成MongoDB语句,而坏事就是有一些linq语句不会被翻译,不会被翻译的代价就 ...

  6. 写了一个常规性生成merge 的小脚本

    现在使用数据库来写存储过程,动不动参数就会用到xml ,当然罗,优势也很明显,参数相对固定,而且灵活,如果要修改或者什么的,中间接口层也不需要做变化,只需要修改封装的存储过程以及程序传参就ok了. 随 ...

  7. OpenGL ES无法获取贴图数据原因

    最近在做一个项目,要从贴图中获取图像数据,查了很多资料,也琢磨很久,获取到的数据都是0.终于在一次偶然的机会,发现了端倪,成功了. 不得不说这"一分灵感"真的很重要 以下是在获取贴 ...

  8. WPF 自定义进度条

    WPF设计界面过程中,有时需要设计一种可以手动滑动修改并实时显示的进度条 进度条,效果如下: 颜色.图标.节点什么的,都可以重新替换. 前端XAML代码: <UserControl x:Clas ...

  9. android 生成验证码图片

    (转自:http://blog.csdn.net/onlyonecoder/article/details/8231373) package com.nobeg.util; import java.u ...

  10. 关于Spring中配置LocalSessionFactoryBean来生成SessionFactory

    转载http://m.blog.csdn.net/blog/SpbDev/8545372     学习Spring的过程中,一直不理解为何配置的bean的class是LocalSessionFacto ...