수열과 쿼리 34

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

요약
두 정수 수열 a와 b를 두고 갱신과 구간 질의를 처리한다. a의 접미사 중 b와 가장 길게 일치하는 것의 길이와 그 개수를 구하고, b의 두 접미사의 최장 공통 접두사를 구하며, b의 두 부분 문자열을 이어 붙인 것이 b의 연속 부분 문자열인지 판정한다.
난이도

어려움10점 중 9점

유형
문자열 매칭, 세그먼트 트리, 정렬, 문자열
정답자
아직 제출이 없습니다

문제

길이가 각각 nn, mm이고 양의 정수로 이루어진 두 수열 aa, bb가 주어질 때, 아래의 쿼리를 수행하는 프로그램을 작성하시오. 모든 인덱스는 1-based이다.

  • 1 y z: a[y]=za[y] = z를 수행한 후 F(a,b)F(a, b)를 출력한다. (1≤y≤n1 \le y \le n, 1≤z≤1051 \le z \le 10^5)
  • 2 y z: F(a[y..z],b)F(a[y..z], b)를 출력한다. (1≤y≤z≤n1 \le y \le z \le n)
  • 3 y z: f(b[y..m],b[z..m])f(b[y..m], b[z..m])를 출력한다. (1≤y,z≤m1 \le y, z \le m)
  • 4 p q r s: 수열 [bp,bp+1,…,bq,br,br+1,…,bs][b_p, b_{p+1}, \ldots, b_q, b_r, b_{r+1}, \ldots, b_s]가 bb의 연속된 부분 수열 중 하나이면 yes, 아니면 no를 출력하라. (1≤p≤q≤m1 \le p \le q \le m, 1≤r≤s≤m1 \le r \le s \le m)

a[l..r]a[l..r]은 [al,al+1,…,ar][a_l, a_{l+1}, \ldots, a_r]인 부분수열이다. bb에 대해서도 같은 방식으로 정의한다.

두 수열 xx, yy에 대해:

  • f(x,y)f(x, y)는 xx와 yy의 최대 공통 접두사(Longest common prefix)의 길이이다.
  • F(x,y)F(x, y)는 두 정수의 쌍 (p,q)(p, q)로, pp는 모든 xx의 접미사(suffix) zz에 대해 f(z,y)f(z, y)의 최댓값, qq는 그러한 최댓값을 이루는 zz의 개수를 뜻한다.

입력

첫 번째 줄에 aa의 길이 nn이 주어진다. (1≤n≤1051 \le n \le 10^5)

다음 줄에 nn개의 정수 a1,a2,…,ana_1, a_2, \ldots, a_n이 주어진다. (1≤ai≤1051 \le a_i \le 10^5)

다음 줄에 bb의 길이 mm이 주어진다. (1≤m≤1051 \le m \le 10^5)

다음 줄에 mm개의 정수 b1,b2,…,bmb_1, b_2, \ldots, b_m이 주어진다. (1≤bi≤1051 \le b_i \le 10^5)

다음 줄에 쿼리의 개수 qq가 주어진다. (1≤q≤1051 \le q \le 10^5)

이후 qq개의 줄에 위에서 설명한 것과 같은 쿼리가 주어진다.

출력

각 쿼리의 결과를 순서대로 한 줄에 하나씩 출력한다.

예제1

  1. 예제 1

    입력
    10
    1 2 3 3 3 1 2 3 2 1
    3
    1 3 1
    10
    3 1 3
    4 3 3 2 2
    2 2 10
    1 3 2
    2 7 9
    2 7 10
    2 3 9
    2 2 8
    1 7 1
    1 4 2
    
    예상 출력
    1
    yes
    1 2
    1 3
    0 3
    1 1
    1 1
    1 1
    2 1
    2 1