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 をxに変更する。
  • find(i)ai の値を出力する。

ただし、ai (i=0,1,...,n−1)は、231-1で初期化されているものとする。

入力

n q
query1
query2
:
queryq

1行目にAの要素数n, クエリの数qが与えられる。続くq行にi 番目のクエリ queryi が与えられる。queryi は以下のいずれかの形式で与えられる。

0 s t x

または

1 i

各クエリの最初の数字は、クエリの種類を示し、‘0‘がupdate(s,t,x)、‘1‘がfind(i) を表す。

出力

findクエリについて、値を1行に出力せよ。

制約

  • 1≤n≤100000
  • 1≤q≤100000
  • 0≤st<n
  • 0≤i<n
  • 0≤x<231−1

入力例 1

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

出力例 1

1
3

入力例 2

1 3
1 0
0 0 0 5
1 0

出力例 2

2147483647
5

区间修改,单点查询,线段树+tag标记。压了压常数,继续打榜。

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

@Author: YouSiki

时间: 2024-10-12 01:28:53

AOJ DSL_2_D Range Update Query (RUQ)的相关文章

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

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を加算する. get(i): aiの値を出力する. ただし.ai (i=1,2,...,n)は.0 で初期化されているものとする. 入力 n q query1 query2 : queryq 1行目にAの要素数n, クエリの数qが与えられる.続くq行に i 番目のクエリ queryi が与えられる.queryi 

Range Sum Query 2D - Mutable &amp; Immutable

Range Sum Query 2D - Mutable Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper left corner (row1, col1) and lower right corner (row2, col2). The above rectangle (with the red border) is defined by (row1,

LeetCode Range Sum Query - Mutable

原题链接在这里:https://leetcode.com/problems/range-sum-query-mutable/ 题目: Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive. The update(i, val) function modifies nums by updating the element at index i to v

2-D range sum query implementation(2-D segment tree)

Google interview question:一个二维数组,有两个方法,一个是update(x,y),更新一个cell的值,一个是query(x1,y1,x2,y2),查询(x1,y1,x2,y2)矩形内所有元素的和. Senario 1. update调用次数远大于query. Senario 2. query调用次数远大于update. Senario 3. 两种方法调用一样多. 对于senario 1,只需要用一个二维数组储存数据,update相应的cell,时间复杂度O(1),qu

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

Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper left corner (row1, col1) and lower right corner (row2, col2). The above rectangle (with the red border) is defined by (row1, col1) = (2, 1) and (row2, co

307. Range Sum Query - Mutable

/* * 307. Range Sum Query - Mutable * 2016-7-3 by Mingyang * 丧心病狂的Segment Tree,无语了 */ class NumArray { class SegmentTreeNode { int start, end; SegmentTreeNode left, right; int sum; public SegmentTreeNode(int start, int end) { this.start = start; this

308. Range Sum Query 2D - Mutable

/* * 308. Range Sum Query 2D - Mutable * 2016-7-3 by Mingyang * 继续丧心病狂的Segment Tree */ class NumMatrix { int[][] tree; int[][] nums; int m; int n; public NumMatrix(int[][] matrix) { if (matrix.length == 0 || matrix[0].length == 0) return; m = matrix.

[LeetCode] Range Sum Query 2D - Immutable

Very similar to Range Sum Query - Immutable, but we now need to compute a 2d accunulated-sum. In fact, if you work in computer vision, you may know a name for such an array --- Integral Image. To solve this problem, Stefan has already posted a very e