#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <functional>
#pragma comment(linker,"/STACK:102400000,102400000")
using namespace std;
#define eps 1e-10
#define N 400030
#define B 20
#define M 3000020
#define inf 0x3f3f3f3f
#define LL long long
#define pii pair<int, int>
#define MP make_pair
#define fi first
#define se second
#define mod 1000000007
#define ls (i << 1)
#define rs (ls | 1)
#define md (ll + rr >> 1)
#define lson ll, md, ls
#define rson md + 1, rr, rs
int n, t[N], a[N], b[N];
int san[N], cnt;
int fa[N], L[N], R[N];
int dc;
vector<int> g[N << 2];
int haxi(int x) {
return lower_bound(san + 1, san + cnt + 1, x) - san;
}
int find(int x) {
if(fa[x] != x) fa[x] = find(fa[x]);
return fa[x];
}
void merge(int u, int v) {
if(rand() & 1) swap(u, v);
u = find(u), v = find(v);
fa[u] = v;
L[v] = min(L[v], L[u]);
R[v] = max(R[v], R[u]);
}
void update(int x, int v, int ll, int rr, int i) {
for(int j = 0; j < g[i].size(); ++j) {
int u = g[i][j];
merge(u, v);
}
g[i].clear();
if(ll == rr) return;
if(x <= md) update(x, v, lson);
else update(x, v, rson);
}
void update2(int l, int r, int v, int ll, int rr, int i) {
if(ll == l && rr == r) {
g[i].push_back(v);
return;
}
if(r <= md) update2(l, r, v, lson);
else if(l > md) update2(l, r, v, rson);
else {
update2(l, md, v, lson);
update2(md + 1, r, v, rson);
}
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%d%d%d", &t[i], &a[i], &b[i]);
if(t[i] == 1) {
--b[i];
a[i] *= 2, b[i] *= 2;
san[++cnt] = a[i];
san[++cnt] = b[i];
san[++cnt] = a[i] - 1;
san[++cnt] = b[i] + 1;
}
}
sort(san + 1, san + cnt + 1);
cnt = unique(san + 1, san + cnt + 1) - san - 1;
for(int i = 1; i <= n; ++i) {
if(t[i] == 1) {
a[i] = haxi(a[i]);
b[i] = haxi(b[i]);
}
}
for(int i = 1; i <= n; ++i) {
if(t[i] == 1) {
++dc;
fa[dc] = dc;
L[dc] = a[i];
R[dc] = b[i];
update(a[i] - 1, dc, 1, cnt, 1);
update(b[i] + 1, dc, 1, cnt, 1);
int t = dc;
t = find(t);
update2(L[t], R[t], t, 1, cnt, 1);
}
else {
int u = find(a[i]);
int v = find(b[i]);
if(u == v || (L[v] <= L[u] && R[v] >= R[u])) puts("YES");
else puts("NO");
}
}
return 0;
}
Codeforces 319E Ping-Pong (线段树+dsu)
最新推荐文章于 2022-04-24 20:41:32 发布