爆零求助
查看原帖
爆零求助
275860
___A__楼主2024/4/2 23:52
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int n,m,node,pre=1,s[N],e[N],p[N],b[N],root[N];
struct segtree{
	int l,r,num,sum;
	segtree(){
		l=r=num=sum=0;
	}
}t[N*50];
int clone(int u){
	t[++node]=t[u];
	return node;
}
void pushup(int u){
	t[u].num=t[t[u].l].num+t[t[u].r].num,t[u].sum=t[t[u].l].sum+t[t[u].r].sum;
}
int build(int u,int l,int r){
	u=clone(u);
	if(l==r){
		return u;
	}
	int mid=(l+r)/2;
	t[u].l=build(0,l,mid),t[u].r=build(0,mid+1,r);
	return u;
}
int update(int u,int l,int r,int pos,int val,int num){
	u=clone(u);
	if(l==r){
		t[u].num+=num,t[u].sum+=val*num;
		return u;
	}
	int mid=(l+r)/2;
	if(pos<=mid){
		update(t[u].l,l,mid,pos,val,num);
	}
	else{
		update(t[u].r,mid+1,r,pos,val,num);
	}
	pushup(u);
	return u;
}
int query(int u,int l,int r,int k){
	if(l==r){
		return t[u].sum/t[u].num*k;
	}
	int mid=(l+r)/2,tmp=t[t[u].l].num;
	if(k<=tmp){
		return query(t[u].l,l,mid,k);
	}
	return t[t[u].l].sum+query(t[u].r,mid+1,r,k-tmp);
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>s[i]>>e[i]>>p[i],b[i]=p[i];
    }
	sort(b+1,b+n+1);
	for(int i=1;i<=n;i++){
		p[i]=lower_bound(b+1,b+n+1,p[i])-b;
	}
	root[0]=build(1,1,n);
	for(int i=1;i<=n;i++){
		int now=1;
		while(i<n&&p[i+1]==p[i]){
			i++,now++;
		}
		update(root[i-1],1,n,s[i],b[p[i]],now),root[i]=update(root[i-1],1,n,e[i]+1,-b[p[i]],now);
	}
	for(int x,a,b,c;m--;){
		cin>>x>>a>>b>>c;
		int k=(a*pre+b)%c+1;
		if(t[root[x]].num<=k){
			pre=t[root[x]].sum;
		}
		else{
			pre=query(root[x],1,n,k);
		}
		cout<<pre<<'\n';
	}
}
2024/4/2 23:52
加载中...