• AOJ DSL_2_A Range Minimum Query (RMQ)


    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
    ", 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

  • 相关阅读:
    A. Ivan the Fool and the Probability Theory
    关于消除“输出中最后的一个空格”问题
    半文件式输入中一种常见的输入方式
    持续输入问题
    汉诺塔问题
    给定两个正整数,求它们的最大公约数。
    第三届全国高校绿色计算机大赛(初赛题目)
    第三届全国高校绿色计算机大赛(初赛题目)
    C++中的输入及其原理简析
    流感传染
  • 原文地址:https://www.cnblogs.com/yousiki/p/6189185.html
Copyright © 2020-2023  润新知