백준 문제풀이

백준 17408 - 수열과 쿼리 24 [Python]

Vermeil 2021. 7. 4. 20:55

https://www.acmicpc.net/problem/17408

 

17408번: 수열과 쿼리 24

길이가 N인 수열 A1, A2, ..., AN이 주어진다. 이때, 다음 쿼리를 수행하는 프로그램을 작성하시오 1 i v: Ai를 v로 바꾼다. (1 ≤ i ≤ N, 1 ≤ v ≤ 109) 2 l r: l ≤ i < j ≤ r을 만족하는 모든 Ai + Aj 중에서

www.acmicpc.net

세그트리 기초문제이다?

 

가장 큰 값과 두번째로 큰 값을 세그트리에 가지고있으면(?) 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import sys
input = sys.stdin.readline
 
seg = [[00for _ in range(404040)]
 
def init(x, s, e):
    if s == e:
        seg[x] = [a[s - 1], 0]
        return seg[x]
    mid = (s + e) // 2
    tmp = init(x * 2, s, mid) + init(x * 2 + 1, mid + 1, e)
    tmp.sort(reverse=True)
    seg[x] = tmp[:2]
    return seg[x]
 
def update(x, s, e, idx, v):
    if e < idx or idx < s:
        return seg[x]
    if s == e:
        if s == idx:
            seg[x] = [v, 0]
        return seg[x]
 
    mid = (s + e) // 2
    tmp = update(x * 2, s, mid, idx, v) + update(x * 2 + 1, mid + 1, e, idx, v)
    tmp.sort(reverse=True)
    seg[x] = tmp[:2]
    return seg[x]
 
def getAns(x, l, r, s, e):
    if e < l or r < s:
        return [00]
    if l <= s and e <= r:
        return seg[x]
    mid = (s + e) // 2
    tmp = getAns(x * 2, l, r, s, mid) + getAns(x * 2 + 1, l, r, mid + 1, e)
    tmp.sort(reverse=True)
    return tmp[:2]
 
= int(input())
= list(map(int, input().split()))
 
init(11, n)
 
= int(input())
for query in range(m):
    q, i, j = map(int, input().split())
    if q == 1:
        update(11, n, i, j)
    else:
        ret = getAns(1, i, j, 1, n)
        print(ret[0+ ret[1])
cs