30分ODT求调
查看原帖
30分ODT求调
785917
Chthollian楼主2024/10/13 20:37

link

#include<bits/stdc++.h>
#define lowbit(x) (x&-x)
#define IT set<Node>::iterator
using namespace std;
struct Node
{
	int l,r,t;
	mutable long long v;
	Node(int L,int R=-1,int T=0,long long V=0) : l(L),r(R),t(T),v(V) {}
	bool operator < (const Node&ano) const
	{
		return l<ano.l;
	}
};
set<Node> s;
int n,m,q,ll,rr,l[10005],r[100005];
long long v[100005],tr[100005],ans[100005];
void xiu(int x,long long y)
{
	if(x<=0)
	{
		return;
	}
	while(x<=n)
	{
		//cout<<x<<" "<<lowbit(x)<<"\n";
		tr[x]+=y;
		x+=lowbit(x);
	}
}
long long cha(int x)
{
	long long ans=0;
	while(x>0)
	{
		ans+=tr[x];
		x-=lowbit(x);
	}
	return ans;
}
IT split(int pos)
{
	IT it=s.lower_bound(Node(pos));
	if(it->l==pos && it!=s.end())
	{
		return it;
	}
	it--;
	int L=it->l,R=it->r,T=it->t;
	long long V=it->v;
	s.erase(it);
	s.insert(Node(L,pos-1,T,V));
	return s.insert(Node(pos,R,T,V)).first;
}
void assign(int l,int r,int t,long long v)
{
	IT itr=split(r+1),itl=split(l);
	for(IT it=itl; it!=itr; ++it)
	{
		xiu(it->t,(long long)-1*(it->r-it->l+1)*it->v);
	}
	s.erase(itl,itr);
	xiu(t,(r-l+1)*v);
	s.insert(Node(l,r,t,v));
}
struct Q
{
	int l,id;
};
vector<Q> que[100005];
int main()
{
	cin>>n>>m>>q;
	s.insert(Node(0,m+1));
	for(int i=1; i<=n; i++)
	{
		cin>>l[i]>>r[i]>>v[i];
	}
	for(int i=1; i<=q; i++)
	{
		cin>>ll>>rr;
		que[rr].emplace_back(Q {ll,i});
	}
	for(int i=1; i<=n; i++)
	{
		assign(l[i],r[i],i,v[i]);
		for(Q qu:que[i])
		{
			ans[qu.id]=cha(i)-cha(qu.l-1);
		}
	}
	for(int i=1; i<=q; i++)
	{
		cout<<ans[i]<<"\n";
	}
	return 0;
}
2024/10/13 20:37
加载中...