Bạn được cho một mảng số nguyên a và nhiều truy vấn. Mỗi truy vấn chọn một đoạn chỉ số [l,r], trong đó cả hai đầu đều thuộc đoạn.
Đặt len=r−l+1. Một giá trị được gọi là nổi bật trong truy vấn nếu nó xuất hiện nhiều hơn⌊len/3⌋ lần trong đoạn al,…,ar.
Với mỗi truy vấn, hãy tìm tất cả các giá trị nổi bật.
Input
Dòng đầu chứa số nguyên t - số bộ test.
Với mỗi bộ test:
Dòng đầu chứa hai số nguyên n và q - độ dài mảng và số truy vấn.
Dòng tiếp theo chứa n số nguyên a1,a2,…,an.
Mỗi dòng trong q dòng tiếp theo chứa hai số nguyên l và r, mô tả đoạn cần xét theo chỉ số 1-based.
Output
Với mỗi truy vấn:
In trên một dòng tất cả các giá trị nổi bật theo thứ tự tăng dần, cách nhau bởi một dấu cách.
Nếu không có giá trị nào nổi bật, in −1.
Constraints
1≤t≤104.
1≤n,q≤2⋅105 trong mỗi bộ test.
1≤ai≤109.
1≤l≤r≤n.
Tổng n qua mọi bộ test không vượt quá 2⋅105.
Tổng q qua mọi bộ test không vượt quá 2⋅105.
Scoring
Subtask 1 (50% số điểm): Trong mỗi bộ test, n,q≤200; đồng thời tổng n và tổng q của cả input đều không vượt quá 1000.
Subtask 2 (50% số điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
1
9 5
4 7 4 9 7 4 7 8 10
1 9
1 7
2 6
4 9
8 8
Output
-1
4 7
4 7
-1
8
Giải thích: Ở truy vấn [1,9], cả 4 và 7 chỉ xuất hiện đúng 3 lần nên không vượt ⌊9/3⌋=3. Trong [1,7] và [2,6], hai giá trị 4,7 đều vượt ngưỡng; còn đoạn một phần tử [8,8] có đáp án là 8.
Lời giải tóm tắt
Ý tưởng: Với mỗi giá trị khác nhau, lưu danh sách tăng dần các vị trí mà nó xuất hiện. Nhờ đó, khi đã có một ứng viên x, số lần x xuất hiện trong [l,r] được tính chính xác bằng hai phép lower_bound/upper_bound.
Ý tưởng: Còn lại là tìm một tập ứng viên rất nhỏ. Nếu đoạn có độ dài không quá 100, ta xét toàn bộ vị trí. Nếu đoạn dài hơn, lấy ngẫu nhiên 100 vị trí trong đoạn. Một đáp án thật chiếm hơn 1/3 đoạn, nên xác suất cả 100 mẫu đều bỏ qua nó nhỏ hơn (2/3)^100. Trong một đoạn có nhiều nhất hai đáp án, vì ba giá trị cùng xuất hiện hơn một phần ba sẽ cần nhiều phần tử hơn độ dài đoạn.
Ý tưởng: Mọi ứng viên đều được đếm lại chính xác trước khi in. Vì vậy thuật toán không bao giờ tạo đáp án sai; xác suất sai duy nhất là bỏ sót một đáp án thật. Dùng union bound cho tối đa 2·10^5 truy vấn, xác suất bỏ sót vẫn nhỏ hơn 4·10^5·(2/3)^100, xấp xỉ 10^-12.
Ý tưởng: Sau khi lọc, sắp xếp các đáp án tăng dần. Tiền xử lý tốn O(n log n). Mỗi truy vấn dùng tối đa 100 ứng viên, mỗi ứng viên được kiểm tra trong O(log n), nên độ phức tạp là O((n+q) log n) với hằng số lấy mẫu cố định; bộ nhớ O(n).