#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N = 5e4 + 5;
int n, m;
ll a[N], b[N];
map <ll, bool> tong;
struct Line_Segment_Tree {
int l, r, maxxid;
ll maxx;
bool is;
} t[4 * N];
void build_tree (ll p, ll l, ll r) {
t[p].l = a[l];
t[p].r = a[r];
t[p].is = false;
if (l == r) {
t[p].maxx = b[l];
t[p].maxxid = l;
return ;
}
ll mid = (l + r) / 2;
build_tree (p * 2, l, mid);
build_tree (p * 2 + 1, mid + 1, r);
if (t[p * 2].is == true || t[p * 2 + 1].is == true || t[p * 2].r + 1 != t[p * 2 + 1].l)
t[p].is = true;
if (t[p * 2].maxx >= t[p * 2 + 1].maxx) {
t[p].maxx = t[p * 2].maxx;
t[p].maxxid = t[p * 2].maxxid;
} else {
t[p].maxx = t[p * 2 + 1].maxx;
t[p].maxxid = t[p * 2 + 1].maxxid;
}
}
bool maybe (ll p, ll mbl, ll mbr) {
if (mbl <= t[p].l && t[p].r <= mbr)
return t[p].is;
bool ans = false, ans1 = false;
bool left = false, right = false;
if (mbl <= t[p * 2].r) {
ans = maybe (p * 2, mbl, mbr);
left = true;
}
if (mbr >= t[p * 2 + 1].l) {
ans1 = maybe (p * 2 + 1, mbl, mbr);
right = true;
}
if (ans == true || ans1 == true || (left == true && right == true && t[p * 2].r + 1 != t[p * 2 + 1].l))
return true;
return false;
}
int ask_maxx (ll p, ll mbl, ll mbr) {
if (mbl <= t[p].l && t[p].r <= mbr)
return t[p].maxxid;
int ans = n + 1, ans1 = n + 1;
if (mbl <= t[p * 2].r)
ans = ask_maxx (p * 2, mbl, mbr);
if (mbr >= t[p * 2 + 1].l)
ans1 = ask_maxx (p * 2 + 1, mbl, mbr);
if (b[ans] >= b[ans1])
return ans;
if (b[ans] < b[ans1])
return ans1;
}
int main () {
ios :: sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i ++) {
cin >> a[i] >> b[i];
tong[a[i]] = i;
}
build_tree (1, 1, n);
cin >> m;
for (int i = 1; i <= m; i ++) {
ll mbr, mbl;
cin >> mbl >> mbr;
bool is_maybe = maybe (1, mbl, mbr);
int ans = ask_maxx (1, mbl + 1, mbr), ans1 = ask_maxx (1, mbl, mbr);
if ((tong[mbl] != 0 && a[ans1] != mbl) || (tong[mbr] != 0 && a[ans] != mbr))
cout << "false";
else if (tong[mbl] == 0 || tong[mbr] == 0 || (tong[mbl] != 0 && tong[mbr] != 0 && is_maybe == true))
cout << "maybe";
else
cout << "true";
cout << endl;
}
return 0;
}
把测试点1下了下来,就输出了一部分数据:
maybe
maybe
maybe
maybe
false
maybe
false
true
true
true
maybe
但是都对