线段树

板子

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5;
int a[N];
int sum[N*4];
void build(int l,int r,int k)
{
	while(l==r)
	{
		sum[k]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid,k*2);
	build(mid+1,r,k*2+1);
	sum[k]=sum[k*2]+sum[k*2+1];
}
int find(int nl,int nr,int x,int k)
{
	if(nl==nr)
	{
		return sum[k];
	}
	int mid=(nl+nr)>>1;
	if(x<=nl)	find(nl,mid,x,k*2);
	else	find(mid+1,nr,x,k*2+1);
}
void change(int nl,int nr,int x,int k,int a)
{
	if(nl==nr)
	{
		sum[k]+=a;
	}
	int mid=(nl+nr)>>1;
	if(x<=nl)	change(nl,mid,x,k*2,a);
	else	change(mid,nr,x,k*2+1,a);
	sum[k]=sum[k*2]+sum[k*2+1];
}
int find2(int nl,int nr,int l,int r,int k)
{
	long long ans=0;
	if(nl>=l&&nr<=r)
	{
		return sum[k];
	}
	int mid=(nl+nr)>>1;
	if(l<=mid)	ans+=find2(nl,mid,l,r,k*2);
	if(r>mid)	ans+=find2(mid+1,nr,l,r,k*2+1);
	return ans;
}

int add[N];
void Add(int k,int l,int r,int v)
{
	add[k]+=v;
	sum[k]+=v*(l-r+1);
}
void pushdown(int k,int l,int r)
{
	if(!add[k])	return ;
	int mid=(l+r)>>1;
	Add(k*2,l,mid,add[k]);
	Add(k*2+1,mid+1,r,add[k]);
	add[k]=0;
}
void change2(int nl,int nr,int l,int r,int k,int v)
{
	if(nl>=l&&nr<=r)
	{
		sum[k]+=v;
		Add(k,nl,nr,v);
	}
	int mid=(nl+nr)>>1;
	pushdown(k,nl,nr);
	if(mid>=l)	change2(nl,mid,l,r,k*2,v);
	else if(mid<r)	change2(mid+1,nr,l,r,k*2+1,v);

}
int main()
{

	return 0;
}
posted @ 2025-01-21 19:24  流氓兔LMT  阅读(12)  评论(0)    收藏  举报