rt,Exec Time 2484 ms。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int read() {
int res = 0;
bool f = true;
char ch = getchar();
for (; ch > '9' || ch < '0'; ch = getchar())
if (ch == '-') f = false;
for (; ch <= '9' && ch >= '0'; ch = getchar())
res = (res << 3) + (res << 1) + (ch ^ 48);
return f ? res : ~res + 1;
}
const int N = 2E5 + 100, W = 1E9 + 10;
int n, m, q, rt[N], cur;
vector<int> tim[N];
map<pair<int, int>, int> mp;
struct Node {
int lc, rc;
int dat;
} st[N << 7];
int cnt;
void PushUp(int p) { st[p].dat = st[st[p].lc].dat + st[st[p].rc].dat; }
void Modify(int &p, int tl, int tr, int ql, int qr) {
if (tl > tr) return;
if (!p) p = ++cnt;
if (ql <= tl && tr <= qr) {
st[p].dat = tr - tl + 1;
return;
}
int mid = (tl + tr) >> 1;
if (ql <= mid) Modify(st[p].lc, tl, mid, ql, qr);
if (mid < qr) Modify(st[p].rc, mid + 1, tr, ql, qr);
PushUp(p);
}
int Merge(int p, int q, int tl, int tr) {
if (st[p].dat == tr - tl + 1) return st[q].dat;
if (st[q].dat == tr - tl + 1) return st[p].dat;
if (!p || !q) return 0;
int mid = (tl + tr) >> 1;
return Merge(st[p].lc, st[q].lc, tl, mid) +
Merge(st[p].rc, st[q].rc, mid + 1, tr);
}
signed main() {
#ifdef HELDIVIS
freopen(".in", "r", stdin);
freopen(".out", "w", stdout);
#endif
n = read(), m = read();
for (int i = 1; i <= m; ++i) {
int t = read(), p = read();
tim[p].push_back(t);
}
for (int i = 1; i <= n; ++i)
for (unsigned j = 1; j < tim[i].size(); j += 2)
Modify(rt[i], 1, W, tim[i][j - 1], tim[i][j] - 1);
q = read();
while (q--) {
int p = read(), q = read();
if (mp.find({p, q}) != mp.end())
printf("%d\n", mp[{p, q}]);
else
printf("%d\n", mp[{p, q}] = Merge(rt[p], rt[q], 1, W));
}
return 0;
}