← Home
package main

import (
	"container/heap"
	"io"
	"os"
	"strings"
)

type FastScanner struct {
	data []byte
	idx  int
}

func (fs *FastScanner) skip() {
	for fs.idx < len(fs.data) && fs.data[fs.idx] <= ' ' {
		fs.idx++
	}
}

func (fs *FastScanner) nextInt() int {
	fs.skip()
	sign := 1
	if fs.idx < len(fs.data) && fs.data[fs.idx] == '-' {
		sign = -1
		fs.idx++
	}
	n := 0
	for fs.idx < len(fs.data) && fs.data[fs.idx] > ' ' {
		n = n*10 + int(fs.data[fs.idx]-'0')
		fs.idx++
	}
	return sign * n
}

func (fs *FastScanner) nextOp() byte {
	fs.skip()
	b := fs.data[fs.idx]
	for fs.idx < len(fs.data) && fs.data[fs.idx] > ' ' {
		fs.idx++
	}
	return b
}

type MaxHeap []int

func (h MaxHeap) Len() int            { return len(h) }
func (h MaxHeap) Less(i, j int) bool  { return h[i] > h[j] }
func (h MaxHeap) Swap(i, j int)       { h[i], h[j] = h[j], h[i] }
func (h *MaxHeap) Push(x interface{}) { *h = append(*h, x.(int)) }
func (h *MaxHeap) Pop() interface{} {
	old := *h
	n := len(old)
	x := old[n-1]
	*h = old[:n-1]
	return x
}

type MinHeap []int

func (h MinHeap) Len() int            { return len(h) }
func (h MinHeap) Less(i, j int) bool  { return h[i] < h[j] }
func (h MinHeap) Swap(i, j int)       { h[i], h[j] = h[j], h[i] }
func (h *MinHeap) Push(x interface{}) { *h = append(*h, x.(int)) }
func (h *MinHeap) Pop() interface{} {
	old := *h
	n := len(old)
	x := old[n-1]
	*h = old[:n-1]
	return x
}

func solveCase(fs *FastScanner, q int, out *strings.Builder) {
	leftCnt := make(map[int]int)
	rightCnt := make(map[int]int)
	lh := &MaxHeap{}
	rh := &MinHeap{}
	heap.Init(lh)
	heap.Init(rh)

	for i := 0; i < q; i++ {
		op := fs.nextOp()
		l := fs.nextInt()
		r := fs.nextInt()

		if op == '+' {
			leftCnt[l]++
			rightCnt[r]++
			heap.Push(lh, l)
			heap.Push(rh, r)
		} else {
			leftCnt[l]--
			if leftCnt[l] == 0 {
				delete(leftCnt, l)
			}
			rightCnt[r]--
			if rightCnt[r] == 0 {
				delete(rightCnt, r)
			}
		}

		for lh.Len() > 0 {
			x := (*lh)[0]
			if leftCnt[x] == 0 {
				heap.Pop(lh)
			} else {
				break
			}
		}
		for rh.Len() > 0 {
			x := (*rh)[0]
			if rightCnt[x] == 0 {
				heap.Pop(rh)
			} else {
				break
			}
		}

		if lh.Len() > 0 && rh.Len() > 0 && (*lh)[0] > (*rh)[0] {
			out.WriteString("YES\n")
		} else {
			out.WriteString("NO\n")
		}
	}
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	fs := &FastScanner{data: data}
	fs.skip()
	if fs.idx >= len(fs.data) {
		return
	}

	var out strings.Builder
	first := fs.nextInt()
	fs.skip()

	if fs.idx < len(fs.data) && (fs.data[fs.idx] == '+' || fs.data[fs.idx] == '-') {
		solveCase(fs, first, &out)
	} else {
		t := first
		for i := 0; i < t; i++ {
			q := fs.nextInt()
			solveCase(fs, q, &out)
		}
	}

	os.Stdout.Write([]byte(out.String()))
}