线段树分裂
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=200010;
int n,m,tot,cnt,seq=1,op,x,y,z,bac[MAXN<<5],ch[MAXN<<5][2],rt[MAXN];
ll val[MAXN<<5];
int newnod () {return (cnt?bac[cnt--]:++tot);}
void del (int p) {
bac[++cnt]=p,ch[p][0]=ch[p][1]=val[p]=0;
return;
}
void modify (int &p,int l,int r,int pos,int v) {
if (!p) {p=newnod();}
val[p]+=v;
if (l==r) {return;}
int mid=(l+r)>>1;
if (pos<=mid) {modify(ch[p][0],l,mid,pos,v);}
else {modify(ch[p][1],mid+1,r,pos,v);}
return;
}
ll query (int p,int l,int r,int xl,int xr) {
if (xr<l||r<xl) {return 0;}
if (xl<=l&&r<=xr) {return val[p];}
int mid=(l+r)>>1;
return query(ch[p][0],l,mid,xl,xr)+query(ch[p][1],mid+1,r,xl,xr);
}
int kth (int p,int l,int r,int k) {
if (l==r) {return l;}
int mid=(l+r)>>1;
if (val[ch[p][0]]>=k) {return kth(ch[p][0],l,mid,k);}
else {return kth(ch[p][1],mid+1,r,k-val[ch[p][0]]);}
}
int merge (int x,int y) {
if (!x||!y) {return x+y;}
val[x]+=val[y];
ch[x][0]=merge(ch[x][0],ch[y][0]);
ch[x][1]=merge(ch[x][1],ch[y][1]);
del(y);
return x;
}
void split (int x,int &y,ll k) {
if (x==0) {return;}
y=newnod();
ll v=val[ch[x][0]];
if (k>v) {split(ch[x][1],ch[y][1],k-v);}
else {swap(ch[x][1],ch[y][1]);}
if (k<v) {split(ch[x][0],ch[y][0],k);}
val[y]=val[x]-k;
val[x]=k;
return;
}
int main () {
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) {
scanf("%d",&x);
modify(rt[1],1,n,i,x);
}
for (int i=1;i<=m;i++) {
scanf("%d",&op);
if (op==0) {
scanf("%d%d%d",&x,&y,&z);
ll k1=query(rt[x],1,n,1,z),k2=query(rt[x],1,n,y,z);
int tmp=0;
split(rt[x],rt[++seq],k1-k2);
split(rt[seq],tmp,k2);
rt[x]=merge(rt[x],tmp);
} else if (op==1) {
scanf("%d%d",&x,&y);
rt[x]=merge(rt[x],rt[y]);
} else if (op==2) {
scanf("%d%d%d",&x,&y,&z);
modify(rt[x],1,n,z,y);
} else if (op==3) {
scanf("%d%d%d",&x,&y,&z);
printf("%lld\n",query(rt[x],1,n,y,z));
} else if (op==4) {
scanf("%d%d",&x,&y);
if (val[rt[x]]<y) {printf("-1\n");continue;}
printf("%d\n",kth(rt[x],1,n,y));
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)