로그 분석
시간 제한2초메모리 제한256 MB
로그 중간 삽입, 구간 삭제, 위치 구간에 나타나는 서로 다른 이벤트 타입 개수를 묻는 질의를 처리한다.
문제
Lisa는 분산 컴퓨터 시스템을 위한 로그 분석 도구를 만들고 있다. 단일 노드의 로그는 뒤에만 덧붙는(append-only) 반면, 분산 로그는 매우 변덕스럽다. 어떤 노드가 온라인이 되면 로그의 과거 위치에 이벤트 묶음을 밀어 넣을 수 있고, 반대로 노드가 오프라인이 되면 일부 로그 항목이 사라질 수 있다.
도구를 안정적이고 빠르게 유지하기 위해, Lisa는 로그의 특정 구간에 나타나는 서로 다른 이벤트 종류의 개수를 추적해야 한다. 분산 처리는 Lisa가 맡고, 여러분은 로컬 엔진을 구현하면 된다.
프로그램은 빈 로그에서 시작하며, 다음 세 가지 연산을 지원해야 한다.
- 삽입(insert)
index number type— 현재index위치에 있는 이벤트 바로 앞에 종류가type인 이벤트를number개 삽입한다.index이상의 위치에 있던 모든 이벤트는 오른쪽으로number칸 밀려 다시 번호가 매겨진다. - 삭제(remove)
index number—index위치부터 연속한 이벤트number개를 지운다. - 질의(query)
index1 index2—index1부터index2까지(양 끝 포함) 위치에 있는 이벤트들 중 서로 다른 종류가 몇 가지인지 센다.
이벤트의 위치 번호는 부터 시작한다. 각 이벤트 종류는 하나의 소문자 알파벳으로 표현된다.
입력
첫 줄에는 연산의 개수 이 주어진다 ().
이어지는 개의 줄에는 각각 하나의 연산이 주어진다. 각 줄은 연산 기호로 시작하며 — 삽입은 +, 삭제는 -, 질의는 ? — 그 뒤에 해당 연산의 인자가 온다.
+ index number type- index number? index1 index2
모든 인덱스는 유효하다. 즉 연산이 가리키는 이벤트는 항상 존재하며, 삭제 연산이 로그의 끝을 넘어가는 일은 없다. 삽입과 삭제 연산의 number는 을 넘지 않는다. 이벤트 종류는 소문자 알파벳이다.
출력
각 질의마다 한 줄에 정수 하나를 출력한다 — index1부터 index2까지(양 끝 포함)에 있는 서로 다른 이벤트 종류의 개수.