만드는 중입니다

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

스트릭과 쿼리

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

요약
제출, 채점 결과 뒤집기, 날짜 넘기기 쿼리가 주어질 때 최장 스트릭이 k번째로 큰 사용자의 값을 출력합니다.
난이도

어려움10점 중 8점

유형
세그먼트 트리, 해시맵, 구현
정답자
아직 제출이 없습니다

문제

solved.ac에서 정지당한 현제는 본인만의 새로운 스트릭 시스템을 만들어 MatKor에 적용하고자 한다.

현제의 스트릭 시스템은 유저별로 독립적으로 동작하며 서로 영향을 주지 않는다. 유저의 스트릭은 다음과 같이 결정된다.

  • 유저는 문제를 풀면 그 문제의 풀이 코드를 한 번에 하나씩 제출할 수 있고, 채점 시스템은 정답이면 맞았습니다!!를, 오답이면 다른 결과를 보여준다.
  • 특정 문제의 “첫 정답 제출”은 시간순으로 볼 때, 그 문제에서 이전에 맞았습니다!!를 받은 적이 없고 처음으로 맞았습니다!!를 받은 제출이다.
  • “재채점”은 기존에 제출된 코드를 다시 채점하는 것이다. 재채점으로 특정 문제의 정답 여부가 바뀌면, 그 문제의 “첫 정답 제출”을 제출 시간 기준으로 다시 계산하므로 “첫 정답 제출”이 달라질 수 있다.
  • 유저가 연속한 dd일 동안 모든 날짜에 “첫 정답 제출”이 존재하면, 그 유저는 “dd-스트릭 그룹”에 포함된다.
  • 유저별 최장 스트릭은 그 유저가 포함되는 “dd-스트릭 그룹” 중 가장 큰 dd의 값이다.

현제는 MatKor 부원 nn명에게 1번부터 nn번까지 번호를 매겼다. 10510^5개의 문제로 구성된 스트릭 시스템을 현제는 시간순으로 들어오는 mm개의 쿼리로 관리하고자 한다.

  • 1 u p c: uu번 유저가 pp번 문제의 풀이 코드를 제출했고, 정답 여부는 cc이다. cc가 1이면 맞았습니다!!, 0이면 오답이다. (1≤u≤N1\le u\le N, 1≤p≤1051\le p\le 10^5, c∈{0,1}c\in\{0,1\})
  • 2: 날짜가 다음 날로 바뀐다.
  • 3 i: ii번째 쿼리의 제출이 재채점되어 정답 여부가 반전된다. 기존 정답은 오답으로, 오답은 정답으로 바뀐다. (1≤i≤m1\le i\le m, ii번째 쿼리는 주어진 1번 쿼리이다.)
  • 4 k: 현재 시점에서 최장 스트릭이 kk번째로 긴 유저의 최장 스트릭을 출력한다. (1≤k≤N1\le k\le N) 이 쿼리는 적어도 한 번 이상 주어진다.

입력

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

다음 mm개의 줄에 시간순으로 위의 네 가지 쿼리 중 하나가 한 줄에 하나씩 주어진다.

출력

4번 쿼리마다 정답을 한 줄에 하나씩, 쿼리 순서대로 출력한다.

예제2

  1. 예제 1

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

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