比赛 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;
}