만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

Farmer John이 3SUM을 푼다

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

요약
각 질의마다 부분 배열 A[a..b]에서 값의 합이 0이 되는 서로 다른 세 인덱스 조합의 개수를 센다.
난이도

어려움10점 중 8점

유형
동적 계획법, 누적 합, 해시맵, 배열
정답자
아직 제출이 없습니다

문제

Farmer John은 알고리즘 설계에서 큰 돌파구를 찾았다고 믿는다. 그는 3SUM 문제에 대해 거의 선형 시간에 동작하는 알고리즘을 찾았다고 주장한다. 3SUM 문제는 지금까지 알려진 해법 중 이차 시간보다 월등히 빠른 것이 없다는 점으로 유명하다. 3SUM 문제의 한 가지 형태는 다음과 같다. 정수 배열 s_1,…,s_ms\_1,\dots,s\_m이 주어졌을 때, 서로 다른 인덱스 i,j,ki,j,k의 순서 없는 삼중항 중 s_i+s_j+s_k=0s\_i + s\_j + s\_k = 0을 만족하는 것의 개수를 세는 것이다.

Farmer John의 주장을 확인하기 위해 Bessie는 NN개의 정수로 이루어진 배열 AA를 준비했다 (1≤N≤50001 \leq N \leq 5000). Bessie는 또한 QQ개의 질의를 준다 (1≤Q≤1051 \leq Q \leq 10^5). 각 질의는 두 인덱스 1≤a_i≤b_i≤N1 \leq a\_i \leq b\_i \leq N으로 구성된다. 각 질의에 대해 Farmer John은 부분 배열 A\[a_i…b_i]A\[a\_i \dots b\_i]에서 3SUM 문제를 풀어야 한다.

안타깝게도 Farmer John은 방금 자신의 알고리즘에 결함이 있음을 발견했다. 그는 알고리즘을 고칠 수 있다고 확신하지만, 그 동안 Bessie의 테스트를 통과할 수 있도록 당신에게 도움을 요청한다!

입력

첫 번째 줄에는 공백으로 구분된 두 정수 NN과 QQ가 주어진다. 두 번째 줄에는 배열 AA의 원소 A_1,…,A_NA\_1,\dots,A\_N이 공백으로 구분되어 주어진다. 이후 QQ개의 줄 각각에는 질의를 나타내는 두 정수 a_ia\_i와 b_ib\_i가 공백으로 구분되어 주어진다.

모든 배열 원소 A_iA\_i에 대해 −106≤A_i≤106-10^6 \leq A\_i \leq 10^6이 보장된다.

출력

출력은 QQ개의 줄로 구성된다. 각 줄 ii에는 ii번째 질의의 답인 정수 하나를 출력한다. 오버플로를 피하기 위해 64비트 정수를 사용해야 한다.

힌트

첫 번째 질의에서 가능한 삼중항은 (A_1,A_2,A_5)(A\_1,A\_2,A\_5)와 (A_2,A_3,A_4)(A\_2,A\_3,A\_4)이다.

예제1

  1. 예제 1

    입력
    7 3
    2 0 -1 1 -2 3 3
    1 5
    2 4
    1 7
    
    예상 출력
    2
    1
    4