Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.util.LinkedList;
- import java.util.Queue;
- public class O1987 {
- static class Segment {
- int id, start, end;
- Queue<Segment> children = new LinkedList<>();
- Segment parent;
- Segment(int id, int start, int end, Segment parent) {
- this.id = id;
- this.start = start;
- this.end = end;
- this.parent = parent;
- }
- boolean covers(int point) {
- return start <= point && point <= end;
- }
- @Override
- public String toString() {
- return start + "#" + end + "(" + children.size() + ")";
- }
- }
- public static void main(String[] args) throws IOException {
- BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
- int n = Integer.parseInt(r.readLine());
- Segment root = new Segment(-1, 0, Integer.MAX_VALUE, null);
- Segment cur = root;
- for (int i = 0; i < n; i++) {
- String[] s = r.readLine().split(" ");
- int start = Integer.parseInt(s[0]), end = Integer.parseInt(s[1]);
- while(start > cur.end) {
- cur = cur.parent;
- }
- cur.children.offer(cur = new Segment(i + 1, start, end, cur));
- }
- int c = Integer.parseInt(r.readLine());
- cur = root;
- for (int i = 0; i < c; i++) {
- int point = Integer.parseInt(r.readLine());
- while(!cur.covers(point)) {
- cur = cur.parent;
- // Current segment can only be leftmost, otherwise it would be removed earlier
- cur.children.remove();
- }
- while(!cur.children.isEmpty()) {
- Segment child = cur.children.element();
- if(!child.covers(point)) {
- if(child.end < point) {
- cur.children.remove();
- } else {
- break;
- }
- } else {
- cur = cur.children.element();
- }
- }
- System.out.println(cur.id);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment