학생 짝짓기

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

요약
각 질의 구간에서 두 학생 번호의 성적 합이 K가 되는 쌍의 개수를 구한다.
난이도

보통10점 중 6점

유형
해시맵, 누적 합, 이분 탐색
정답자
아직 제출이 없습니다

문제

오클버리 학교는 해마다 아주 많은 신입생을 받는다. 어떤 해에는 입학생이 백만 명에 가까웠다. 이 학교는 프로그래밍 대회 실력을 중요하게 여겨서, 입학할 때 학생마다 실력 점수를 하나씩 매긴다. 실력 점수는 −109-10^9 이상 10910^9 이하의 정수다.

그해 입학생에게는 11번부터 NN번까지 번호를 붙인다. NN은 그해 입학생 수다. 이 번호는 신입생 대회에서 학생을 가리키는 데 쓴다. 신입생 대회는 한 해 동안 자주 열리고, 그해 입학생만 나갈 수 있다.

대회가 열릴 때마다 학교 컴퓨터가 11 이상 NN 이하의 번호 두 개를 뽑는다. 뽑힌 두 번호 사이에 있는 학생은 양 끝을 포함해서 두 명씩 팀을 이뤄 다른 팀과 겨룬다. 교장은 공정함을 중요하게 여겨서, 두 학생의 실력 점수 합이 그날 정한 값 KK와 같은 팀만 출전을 허락한다.

한 해에 열린 대회 MM개가 주어진다. 각 대회마다 뽑힌 두 번호 사이에서 만들 수 있는 팀이 몇 개인지 구하여라. 팀은 학생 두 명을 고른 순서 없는 쌍이고, 학생 번호 쌍이 다르면 서로 다른 팀으로 센다. 한 학생이 여러 팀에 들어가도 각각 따로 센다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다.

각 테스트 케이스의 첫째 줄에 세 정수 NN, MM, KK가 주어진다. (1≤N≤1051 \le N \le 10^5, 1≤M≤1051 \le M \le 10^5, 1≤K≤1061 \le K \le 10^6)

둘째 줄에 학생 NN명의 실력 점수가 11번 학생부터 순서대로 주어진다. 각 점수는 −109-10^9 이상 10910^9 이하의 정수다.

다음 MM개 줄에 컴퓨터가 뽑은 번호 ii와 jj가 한 줄에 하나씩 주어진다. (1≤i,j≤N1 \le i, j \le N) 두 번호는 뽑힌 순서 그대로 주어지므로 ii가 jj보다 클 수도 있다. 이때 구간은 둘 중 작은 번호부터 큰 번호까지다.

NN, MM, KK가 모두 00인 줄이 나오면 입력이 끝난다. 이 줄은 테스트 케이스가 아니다.

테스트 케이스는 최대 2020개이고, 모든 테스트 케이스의 NN의 합과 MM의 합은 각각 2×1052 \times 10^5 이하다.

출력

각 테스트 케이스마다 대회가 주어진 순서대로 한 줄에 하나씩, 그 구간에서 만들 수 있는 팀의 개수를 출력한다. 한 테스트 케이스의 출력을 마칠 때마다 빈 줄을 하나 출력한다.

힌트

첫 번째 예제에서는 학생 네 명이 줄을 서 있고 교장이 정한 합은 55다. 첫 번째 대회에서 컴퓨터가 11과 44를 뽑아 네 명 모두가 구간에 들어간다. 이 구간에서 합이 55인 팀은 앞의 두 학생으로 이루어진 한 팀뿐이다. 두 번째 대회에서는 33과 44를 뽑는데, 두 학생의 점수 합이 55가 아니므로 만들 수 있는 팀이 없다.

예제3

  1. 예제 1

    입력
    4 2 5
    2 3 1 5
    1 4
    3 4
    0 0 0
    
    예상 출력
    1
    0
    
    
  2. 예제 2

    입력
    5 4 7
    3 4 3 4 3
    5 1
    2 2
    4 3
    1 3
    0 0 0
    
    예상 출력
    6
    0
    1
    2
    
    
  3. 예제 3

    입력
    3 1 4
    2 2 2
    1 3
    4 2 3
    1 2 1 2
    1 4
    2 3
    2 1 10
    5 5
    1 2
    0 0 0
    
    예상 출력
    3
    
    4
    1
    
    1