코인과 쿼리

시간 제한3초메모리 제한1024 MB

요약
각 질의 (L, R, X)마다 매수 시작일 i를 [L, R]에서 골라 i일부터 X일까지 매일 한 개씩 사서 X일에 전부 팔 때의 최대 이익을 구하고, 이득이 없으면 0을 출력한다.
난이도

어려움10점 중 8점

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

문제

시루는 NN일 동안의 코인 가격 A_1,A_2,⋯ ,A_NA\_1, A\_2, \cdots, A\_N을 예측할 수 있는 능력을 갖게 되었다. 시루는 이 능력을 토대로 분할 매수 전략을 이용해 이득을 극대화하려고 한다. 분할 매수 전략이란, 1≤i≤j≤N1 \le i \le j \le N을 만족하는 두 정수 i,ji, j를 정한 다음, ii번째 날부터 jj번째 날까지 매일 코인을 1개씩 매수하고, jj번째 날에 보유한 모든 코인을 한 번에 매도하는 방식을 의미한다.

예를 들어서 7일 동안의 코인 가격이 9,8,2,4,3,5,39, 8, 2, 4, 3, 5, 3이라고 하자. i=3,j=6i = 3, j = 6으로 정하면 4일 동안 4개의 코인을 2+4+3+5=142+4+3+5=14원에 매수한 다음 모든 코인을 개당 55원에 매도하므로 총 5×4−14=65 \times 4 - 14 = 6원의 이득을 얻을 수 있다. 거래를 하지 않을 수도 있으며, 이때의 이익은 0원이다.

시루는 여러가지 거래 시나리오를 고려해 보려고 한다. 구체적으로, 세 정수 L,R,XL, R, X가 주어지면 매수 시작일 ii가 LL 이상 RR 이하이고 매도일 jj가 XX가 되도록 i,ji, j를 선택할 때 얻을 수 있는 최대 이익을 구하고자 한다.

NN일 동안의 코인 가격과 QQ개의 거래 시나리오가 주어지면, 각 시나리오에서 얻을 수 있는 최대 이익을 구하는 프로그램을 작성하라. 이익을 얻을 수 있는 거래가 없는 경우 아무것도 하지 않을 수 있으며, 이때의 답은 0임에 유의하라.

입력

첫째 줄에 거래일 수 NN과 시나리오 수 QQ가 공백으로 구분되어 주어진다.

그다음 줄에 NN개의 정수 A_1,A_2,⋯ ,A_NA\_1, A\_2, \cdots, A\_N이 공백으로 구분되어 주어진다. 이는 ii번째 날의 코인 가격이 A_iA\_i임을 의미한다.

이어지는 QQ개의 줄의 ii번째 줄에는 ii번째 거래 시나리오에 대한 정보를 나타내는 세 개의 정수 L,R,XL, R, X가 공백으로 구분되어 주어진다.

출력

QQ개의 줄에 걸쳐 답을 출력한다. ii번째 줄에 ii번째 시나리오에 대한 답을 출력한다.

제한

  • 1≤N,Q≤500,0001 \le N, Q \le 500\\,000
  • 1≤A_i≤1,000,0001 \le A\_i \le 1\\,000\\,000 (1≤i≤N1 \le i \le N)
  • 1≤L≤R≤X≤N1 \le L \le R \le X \le N

예제1

  1. 예제 1

    입력
    7 5
    2 5 6 5 2 1 7
    1 4 7
    1 3 4
    2 3 3
    4 6 7
    1 4 6
    
    예상 출력
    21
    2
    1
    13
    0