线段树
板子
#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;
}
本文来自博客园,作者:流氓兔LMT,转载请注明原文链接:https://www.cnblogs.com/-include-lmt/p/18684316

浙公网安备 33010602011771号