| 比赛 |
2026.4.4 |
评测结果 |
TTTTTTTTTT |
| 题目名称 |
区间 |
最终得分 |
0 |
| 用户昵称 |
LikableP |
运行时间 |
51.007 s |
| 代码语言 |
C++ |
内存使用 |
7.76 MiB |
| 提交时间 |
2026-04-04 11:54:37 |
显示代码纯文本
#include <cstdio>
typedef long long ll;
const int MAXN = 5e5 + 10;
const ll MAXV = 666623333;
const ll MOD = 666623333;
struct SegmentTree {
struct NODE {
ll sum;
ll lazy;
int ls, rs;
} node[MAXN * 40];
int nodeNum = 0, root = 0;
void Clear() {
for (int i = 1; i <= nodeNum; ++i) {
node[i] = {0, 0, 0, 0};
}
nodeNum = root = 0;
}
void PushUp(int root) {
if (!node[root].ls) node[root].ls = ++nodeNum;
if (!node[root].rs) node[root].rs = ++nodeNum;
node[root].sum = node[node[root].ls].sum + node[node[root].rs].sum;
}
void PushDown(int root, int lt, int rt) {
if (node[root].lazy) {
if (!node[root].ls) node[root].ls = ++nodeNum;
if (!node[root].rs) node[root].rs = ++nodeNum;
int mid = lt + ((rt - lt) >> 1);
node[node[root].ls].sum = mid - lt + 1;
node[node[root].ls].lazy = 1;
node[node[root].rs].sum = rt - mid;
node[node[root].rs].lazy = 1;
node[root].lazy = 0;
}
}
void SetSeq(int &root, int lt, int rt, int lq, int rq) {
if (lq > rq) return ;
if (!root) root = ++nodeNum;
if (lt == lq && rt == rq) {
node[root].sum = rt - lt + 1;
node[root].lazy = 1;
return ;
}
PushDown(root, lt, rt);
int mid = lt + ((rt - lt) >> 1);
if (rq <= mid) {
SetSeq(node[root].ls, lt, mid, lq, rq);
} else if (lq > mid) {
SetSeq(node[root].rs, mid + 1, rt, lq, rq);
} else {
SetSeq(node[root].ls, lt, mid, lq, mid);
SetSeq(node[root].rs, mid + 1, rt, mid + 1, rq);
}
PushUp(root);
}
} T;
ll kasumi(ll x, ll y) {
ll res = 1;
while (y) {
if (y & 1) res = res * x % MOD;
y >>= 1;
x = x * x % MOD;
}
return res;
}
int n, m;
ll l[MAXN], r[MAXN];
ll f(int L, int R) {
T.Clear();
for (int i = L; i <= R; ++i) {
T.SetSeq(T.root, 0, MAXV, l[i], r[i] - 1);
}
return T.node[T.root].sum;
}
int main() {
freopen("interval.in", "r", stdin);
freopen("interval.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i) {
scanf("%lld %lld", &l[i], &r[i]);
}
while (m--) {
int A, B;
ll sum = 0, cnt = 0;
scanf("%d %d", &A, &B);
for (int L = A; L <= B; ++L) {
for (int R = L; R <= B; ++R) {
sum = (sum + f(L, R)) % MOD, ++cnt;
}
}
printf("%lld\n", sum * kasumi(cnt, MOD - 2) % MOD);
}
return 0;
}