RT,我也不知道哪里错了。
分类讨论是照着第二篇题解改的。
#include <array>
#include <cmath>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 50010, INF = 2e9;
int f[N][30], g[N][30]; // max min
int n, q, m;
array<int, N> w;
vector<int> ys;
struct Data
{
int year, val;
}d[N];
void init(const array<int, N> &w, int n)
{
int t = log(n) / log(2) + 1;
for (int i = 1; i <= n; i ++ ) f[i][0] = w[i];
for (int j = 1; j <= t; j ++ )
for (int i = 1; i <= n; i ++ )
f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
}
int query(int l, int r)
{
int t = log(r - l + 1) / log(2);
return max(f[l][t], f[r - (1 << t) + 1][t]);
}
void init0(const array<int, N> &w, int n)
{
int t = log(n) / log(2) + 1;
for (int i = 1; i <= n; i ++ ) g[i][0] = w[i];
for (int j = 1; j <= t; j ++ )
for (int i = 1; i <= n; i ++ )
g[i][j] = min(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
}
int query0(int l, int r)
{
int t = log(r - l + 1) / log(2);
return min(g[l][t], g[r - (1 << t) + 1][t]);
}
int get(int year)
{
int l = 1, r = ys.size() - 1;
while (l < r)
{
int mid = l + r + 1 >> 1;
if (ys[mid] <= year) l = mid;
else r = mid - 1;
}
return r;
}
bool check(int year)
{
if (ys[get(year)] != year) return false;
else return true;
}
int main()
{
ys.push_back(INF);
scanf("%d", &n);
for (int i = 1; i <= n; i ++ )
{
scanf("%d%d", &d[i].year, &d[i].val);
ys.push_back(d[i].year);
w[ ++ m] = d[i].val;
}
init(w, m);
init0(w, m);
scanf("%d", &m);
while (m -- )
{
int x, y;
scanf("%d%d", &y, &x);
bool a = check(y), b = check(x);
// printf("%d %d\n", a, b);
int l = get(y), r = get(x);
l ++ ;
if (b) r -- ;
int v = l <= r ? query(l, r) : -INF;
// printf("%d\n", v);
if ((b && v >= w[get(x)]) || (a && v >= w[get(y)]) || (a && b && w[get(y)] < w[get(x)]))
puts("false");
else if (!a || !b || x - y != get(x) - get(y)) puts("maybe");
else puts("true");
}
return 0;
}