연산

면접 대비

시간 제한2초메모리 제한512 MB

요약
값이 0으로 시작하는 정수 배열에 대해 한 점 더하기, 한 점 0으로 만들기, 구간 합 질의를 처리하고 각 갱신 뒤 배열 전체 합을 출력한다.
난이도

보통10점 중 5점

유형
세그먼트 트리, 누적 합, 배열, 이분 탐색
정답자
아직 제출이 없습니다

문제

값이 0으로 초기화되어 있고 인덱스가 0부터 시작하는 정수 배열 AA에 대해 다음 세 함수가 주어진다.

  • 더하기 (key, value): A[key]A[key]의 값을 value만큼 더한다. 리턴하는 값은 A[key]A[key]가 아니라, 배열 AA 값 전체의 합이다.
  • 구간합 (key1, key2): key1≤i≤key2key1 \le i \le key2인 모든 ii에 대한 A[i]A[i]의 구간합을 리턴한다. (key1≤key2key1 \le key2)
  • 삭제 (key): A[key]A[key]의 값을 0으로 만든다. 리턴하는 값은 역시 해당 연산 이후 배열 AA 값 전체의 합이다.

연산을 수행할 때마다 리턴값을 출력하는 프로그램을 작성하시오.

예를 들어 아래와 같은 12개의 연산을 순서대로 적용한다고 해보자. 화살표 이후에 나타나는 값이 바로 당신의 프로그램이 출력해야 하는 값이다.

  • 더하기 (key=27, value=30) → 30
  • 더하기 (key=25, value=40) → 70
  • 삭제 (key=17) → 70
  • 더하기 (key=17, value=20) → 90
  • 더하기 (key=5, value=50) → 140
  • 구간합 (key1=10, key2=20) → 20
  • 구간합 (key1=25, key2=30) → 70
  • 삭제 (key=25) → 100
  • 삭제 (key=17) → 80
  • 더하기 (key=27, value=20) → 100
  • 구간합 (key1=10, key2=20) → 0
  • 구간합 (key1=25, key2=30) → 50

총 nn개의 연산이 주어졌을 때, 각 연산을 적용한 이후 올바른 값을 출력하는 프로그램을 작성하시오.

입력

첫 줄에 연산의 수 nn이 주어진다.

각 연산은 종류에 따라 아래와 같은 형태로 한 줄에 하나씩 주어진다.

  • 더하기: 줄의 첫 입력으로 1이 주어지고, 이후에 key와 value가 공백으로 구분되어 주어진다.
  • 구간합: 줄의 첫 입력으로 2가 주어지고, 이후에 두 개의 key가 공백으로 구분되어 주어진다.
  • 삭제: 줄의 첫 입력으로 3이 주어지고, 이후에 key가 주어진다.

출력

한 줄에 각 함수의 리턴값을 공백으로 구분해서 출력해야 한다.

힌트

입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다.

C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL)과 sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf/printf/puts/getchar/putchar 등 C의 입출력 방식을 사용하면 안 된다.

Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.

Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.

예제2

  1. 예제 1

    입력
    12
    1 27 30
    1 25 40
    3 17
    1 17 20
    1 5 50
    2 10 20
    2 25 30
    3 25
    3 17
    1 27 20
    2 10 20
    2 25 30
    
    예상 출력
    30 70 70 90 140 20 70 100 80 100 0 50
    
  2. 예제 2

    입력
    8
    1 2 10
    1 4 10
    1 15 10
    2 2 15
    2 3 14
    3 4
    3 10
    2 4 15
    
    예상 출력
    10 20 30 30 10 20 20 10