| 比赛 |
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;
}