比赛 2026.9.12 评测结果 AAAAAAAAAA
题目名称 画线 最终得分 100
用户昵称 xuyuqing 运行时间 1.556 s
代码语言 C++ 内存使用 13.92 MiB
提交时间 2026-09-12 10:36:04
显示代码纯文本

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

const int N = 1000010;

int n;
int q;
bool vis[N];
int min_tree[N << 2];
int max_tree[N << 2];

int lson (int id) {
	return id * 2;
}

int rson (int id) {
	return id * 2 + 1;
}

void build (int now, int nowl, int nowr) {
	if (nowl == nowr) {
		min_tree[now] = 1e9;
		max_tree[now] = -1e9;
		return;
	}
	
	int mid = (nowl + nowr) / 2;
	build (lson (now), nowl, mid);
	build (rson (now), mid + 1, nowr);
	min_tree[now] = 1e9;
	max_tree[now] = -1e9;
}

void min_update (int pos, int num, int now, int nowl, int nowr) {
	if (nowl == nowr) {
		min_tree[now] = num;
		return;
	}
	
	int mid = (nowl + nowr) / 2;
	if (pos <= mid) {
		min_update (pos, num, lson (now), nowl, mid);
	}
	else {
		min_update (pos, num, rson (now), mid + 1, nowr);
	}
	
	min_tree[now] = min (min_tree[lson (now)], min_tree[rson (now)]);
}

void max_update (int pos, int num, int now, int nowl, int nowr) {
	if (nowl == nowr) {
		max_tree[now] = num;
		return;
	}
	
	int mid = (nowl + nowr) / 2;
	if (pos <= mid) {
		max_update (pos, num, lson (now), nowl, mid);
	}
	else {
		max_update (pos, num, rson (now), mid + 1, nowr);
	}
	
	max_tree[now] = max (max_tree[lson (now)], max_tree[rson (now)]);
}

int min_query (int l, int r, int now, int nowl, int nowr) {
	if (l <= nowl && nowr <= r) {
		return min_tree[now];
	}
	
	int mid = (nowl + nowr) / 2;
	int ans = 1e9;
	if (l <= mid) {
		ans = min (ans, min_query (l, r, lson (now), nowl, mid));
	}
	if (r >= mid + 1) {
		ans = min (ans, min_query (l, r, rson (now), mid + 1, nowr));
	}
	
	return ans;
}

int max_query (int l, int r, int now, int nowl, int nowr) {
	if (l <= nowl && nowr <= r) {
		return max_tree[now];
	}
	
	int mid = (nowl + nowr) / 2;
	int ans = -1e9;
	if (l <= mid) {
		ans = max (ans, max_query (l, r, lson (now), nowl, mid));
	}
	if (r >= mid + 1) {
		ans = max (ans, max_query (l, r, rson (now), mid + 1, nowr));
	}
	
	return ans;
}

int main () {
	
	freopen ("circle.in", "r", stdin);
	freopen ("circle.out", "w", stdout);
	
	scanf ("%d%d", &n, &q);
	build (1, 1, n);
	for (int i = 1; i <= q; i++) {
		int x, y;
		scanf ("%d%d", &x, &y);
		
		if (x > y) {
			swap (x, y);
		}
		
		if (vis[x] || vis[y]) {
			printf ("No\n");
			continue;
		}
		
		if (min_query (x, y, 1, 1, n) < x || max_query (x, y, 1, 1, n) > y) {
//			cout << min_query (x, y, 1, 1, n) << ' ' << x << ' ' << max_query (x, y, 1, 1, n) << ' ' << y << endl;
			printf ("No\n");
			continue;
		}
		
		min_update (y, x, 1, 1, n);
		max_update (x, y, 1, 1, n);
		vis[x] = vis[y] = true;
		
		printf ("Yes\n");
	}
	
	return 0;
}