아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

문제 준비

면접 대비

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

요약
배열의 원소를 하나씩 늘리거나 줄이는 갱신이 주어질 때, 주어진 k에 대해 ceil(t_i / k)의 합을 구한다.
난이도

보통10점 중 7점

유형
수학, 누적 합, 배열, 구현
정답자
아직 제출이 없습니다

문제

앤드루는 대회에 낼 프로그래밍 문제 nn개를 만들었고, 이제 문제를 다듬으려고 한다. ii번 문제를 준비하는 데 필요한 총 시간은 tit_i분이라고 추정했다. 앤드루는 친구들을 불러 이 일을 나눠 맡길 생각이다.

몇 명이 도와줄지는 아직 모르지만 일은 공평하게 나누고 싶다. 그래서 ii번 문제마다 정수 xix_i를 정하고, 도와주는 친구는 모두 그 문제에 xix_i분씩 쓴다. 친구들이 ii번 문제에 쓴 시간의 합이 tit_i분 이상이면 그 문제는 완전히 준비된 것이다. 친구가 kk명일 때 xix_i는 k×xi≥tik \times x_i \ge t_i를 만족하는 가장 작은 정수로 정한다.

앤드루는 문제의 난이도를 잘못 봤다는 것을 알아차리면 tit_i를 1 늘리거나 1 줄인다.

처음 추정한 tit_i가 주어진다. 쿼리 mm개를 주어진 순서대로 처리하라. 각 쿼리는 다음 중 하나다.

  • 1 i: 앤드루가 tit_i를 1 늘린다.
  • 2 i: 앤드루가 tit_i를 1 줄인다.
  • 3 k: 친구 kk명이 도와준다면 친구 한 명이 문제 nn개를 준비하는 데 몇 분을 쓰는지 앤드루가 알고 싶어 한다.

입력

첫째 줄에 문제의 개수 nn과 쿼리의 개수 mm이 주어진다. (1≤n,m≤1051 \le n, m \le 10^5)

둘째 줄에 정수 t1,t2,…,tnt_1, t_2, \dots, t_n이 주어진다. tit_i는 앤드루가 ii번 문제에 대해 처음 추정한 시간이다. (1≤ti≤5×1051 \le t_i \le 5 \times 10^5)

다음 mm개 줄에 쿼리가 한 줄에 하나씩, 두 정수 qq와 vv로 주어진다. qq가 1이면 tvt_v를 1 늘리고, 2이면 tvt_v를 1 줄인다. 두 경우 모두 1≤v≤n1 \le v \le n이다. qq가 3이면 친구 vv명이 도와줄 때 친구 한 명이 쓰는 시간을 구해야 한다. 이 경우 1≤v≤5×1051 \le v \le 5 \times 10^5이다.

어떤 쿼리를 처리한 뒤에도 모든 tit_i는 1 이상 5×1055 \times 10^5 이하다.

출력

qq가 3인 쿼리마다 친구 한 명이 문제 nn개를 준비하는 데 쓰는 시간의 합 x1+x2+⋯+xnx_1 + x_2 + \dots + x_n을 한 줄에 하나씩 출력한다.

예제2

  1. 예제 1

    입력
    5 11
    1 2 3 4 5
    3 1
    3 2
    3 3
    1 1
    3 1
    3 2
    3 3
    2 5
    3 1
    3 2
    3 3
    
    예상 출력
    15
    9
    7
    16
    9
    7
    15
    8
    7
    
  2. 예제 2

    입력
    1 6
    1
    3 1
    3 500000
    1 1
    3 1
    3 2
    3 3
    
    예상 출력
    1
    1
    2
    1
    1