记录编号 613923 评测结果 AAAAAAAAAA
题目名称 4372.区间 最终得分 100
用户昵称 GravatarRpUtl 是否通过 通过
代码语言 C++ 运行时间 9.801 s
提交时间 2026-04-02 15:41:03 内存使用 28.08 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int mod=666623333;
const int N=5e5+10;
typedef long long ll;
ll ksm(ll a,ll b){
	ll ans=1;
	a%=mod;
	while(b){
		if(b&1)ans=(ans*a)%mod;
		a=(a*a)%mod;
		b>>=1;
	}
	return ans;
}
int n,m,b[N<<1],t;
ll w[N<<1],ans[N],ST;
struct node{int l,r,id;}q[N];
struct cht{
	int l,r,v;
	bool operator < (const cht &b)const{
		return l<b.l;
	}
};
set<cht>s;
typedef set<cht>::iterator iter;
struct sgt{
	ll sum[N<<2],tag[N<<2];
	#define ls (p<<1)
	#define rs (p<<1|1)
	void pushup(int p){
		sum[p]=(sum[ls]+sum[rs])%mod;
	}
	void pushdown(int p,int l,int r){
		if(!tag[p])return;int m=(l+r)>>1;
		(sum[ls]+=tag[p]*(m-l+1)%mod)%=mod;
		(sum[rs]+=tag[p]*(r-m)%mod)%=mod;
		(tag[ls]+=tag[p])%=mod;
		(tag[rs]+=tag[p])%=mod;
		tag[p]=0;return;
	}
	void add(int p,int l,int r,int L,int R,ll v){
		if(L<=l&&r<=R){
			(sum[p]+=(r-l+1)*v%mod)%=mod;
			(tag[p]+=v)%mod;
		}else{
			pushdown(p,l,r);int mid=(l+r)>>1;
			if(L<=mid)add(ls,l,mid,L,R,v);
			if(R>mid)add(rs,mid+1,r,L,R,v);
			pushup(p);
		}
	}
	ll ask(int p,int l,int r,int L,int R){
		if(L<=l&&r<=R)return sum[p];
		int mid=(l+r)>>1;ll cnt=0;pushdown(p,l,r);
		if(L<=mid)cnt+=ask(ls,l,mid,L,R),cnt%=mod;
		if(R>mid)cnt+=ask(rs,mid+1,r,L,R),cnt%=mod;
		return cnt;
	}
}tra,trc;
void upd(int l,int r,int v){
	v%=mod;
	tra.add(1,1,n,l,r,v);
	trc.add(1,1,n,l,r,-v*ST%mod);
	return;
}
ll ask(int l,int r){
	ll ans=ST*tra.ask(1,1,n,l,r)%mod;
	ans+=trc.ask(1,1,n,l,r);
	return (ans%mod+mod)%mod;
}
iter split(int x){
	iter it=s.lower_bound(cht{x,0,0});
	if(it!=s.end()&&it->l==x)return it;it--;
	int L=it->l,R=it->r,v=it->v;
	s.erase(it),s.insert(cht{L,x-1,v});
	return s.insert(cht{x,R,v}).first;
}
void assign(int l,int r,int i){
	iter itr=split(r+1),itl=split(l);
	for(iter it=itl;it!=itr;it++){
		ll val=w[it->r]-w[it->l-1];
		upd(it->v+1,i,val);
	}
	s.erase(itl,itr);
	s.insert(cht{l,r,i});
	ST++;
}
int l[N],r[N];
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("%d %d",l+i,r+i);
		b[++t]=l[i],b[++t]=r[i];
	}
	sort(b+1,b+1+t);
	t=unique(b+1,b+1+t)-(b+1);
	for(int i=1;i<t;i++)w[i]=b[i+1]-b[i]+w[i-1];
	for(int i=1;i<=n;i++){
		l[i]=lower_bound(b+1,b+1+t,l[i])-b;
		r[i]=lower_bound(b+1,b+1+t,r[i])-b-1;
	}
	for(int i=1;i<=m;i++){
		scanf("%d %d",&q[i].l,&q[i].r);
		q[i].id=i;
	}
	s.insert(cht{1,t-1,0});
	sort(q+1,q+1+m,[&](node &u,node &v){
		return u.r<v.r;
	});
	for(int i=1,j=1;i<=n;i++){
		assign(l[i],r[i],i);
		while(j<=m&&q[j].r<=i){
			ans[q[j].id]=ask(q[j].l,q[j].r);
			ll L=q[j].r-q[j].l+1;
			ll inv=ksm((L+1)*L/2,mod-2);
			(ans[q[j].id]*=inv)%=mod;
			j++;
		}
	}
	for(int i=1;i<=m;i++){
		printf("%lld\n",ans[i]);
	}
	return 0;
}