RT,写的线段树动态开点+永久化标记
感谢dalao
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define rd read()
#define mkp make_pair
#define fi first
#define se second
#define psb push_back
#define Elaina 0
#define mst(a,b) memset((a),(b),sizeof(a))
#define random(a,b) (1ll*rand()*rand()*rand()%((b)-(a)+1)+(a))
inline ll read(){
ll f=1,x=0;
char ch=getchar();
for(;!isdigit(ch);ch=getchar()) f=(ch=='-'?-1:1);
for(;isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
return f*x;
}
const int mod=998244353;
const int N=2e5+100;
const int inf=0x7fffffff7fffffff;
const int M=1e9;
int n,d,ans,mx=0,mn=inf;
int rt,sum,il,ir,mxx;
int a[N],b[N];
namespace SEG{
int ncnt=0;
int ls[N],rs[N];
struct TR{
int sum,lz;
}tr[N<<8];
void update(int &rt,int l,int r,int ql,int qr,int k){
if(!rt) rt=++ncnt;
tr[rt].sum+=(qr-ql+1)*k;
if(l==ql&&r==qr){
tr[rt].lz+=k;
return ;
}
int mid=(l+r)>>1;
if(qr<=mid) update(ls[rt],l,mid,ql,qr,k);
else{
if(ql>mid) update(rs[rt],mid+1,r,ql,qr,k);
else{
update(ls[rt],l,mid,ql,mid,k);
update(rs[rt],mid+1,r,mid+1,qr,k);
}
}
return ;
}
int query(int rt,int l,int r,int ql,int qr,int tag){
if(!rt) return 0;
if(l==ql && r==qr){
return tr[rt].sum+(qr-ql+1)*tag;
}
int mid=(l+r)>>1,res=0;
tag+=tr[rt].lz;
if(qr<=mid) res+=query(ls[rt],l,mid,ql,qr,tag);
else{
if(ql>mid) res+=query(rs[rt],mid+1,r,ql,qr,tag);
else{
res+=query(ls[rt],l,mid,ql,mid,tag);
res+=query(rs[rt],mid+1,r,mid+1,qr,tag);
}
}
return res;
}
}
using namespace SEG;
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
update(rt,1,M,1,10,1);
for(int i=1;i<=10;i++){
cout<<query(1,1,M,i,i,0)<<'\n';
}
return Elaina;
}