#include <iostream>
#define int long long
using namespace std;
int tree[800001],amm[200001],lzy[800001];
int n,m,id,x,y;
void pushup(int u){
tree[u]=tree[u*2]+tree[u*2+1];
}
bool init(int L,int R,int l,int r){
return L<=l&&r<=R;
}
bool outit(int L,int R,int l,int r){
return L>r||R<l;
}
void maketag(int u,int l,int r,int x){
lzy[u]=x;
tree[u]=(r-l+1)*x;
}
void pushdown(int u,int l,int r,int x){
int mid=l+r>>1;
maketag(u*2,l,mid,x);
maketag(u*2+1,mid+1,r,x);
lzy[u]=0;
}
void build(int u,int l,int r){
if(l==r){
tree[l]=amm[l];
return;
}
int mid=l+r>>1;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
pushup(u);
}
void find(int u,int l,int r,int x,int y){
if(l==r){
tree[u]=y;
return;
}
pushdown(u,l,r,lzy[u]);
int mid=l+r>>1;
if(x<=mid) find(u*2,l,mid,x,y);
else find(u*2+1,mid+1,r,x,y);
pushup(u);
}
void update(int u,int L,int R,int l,int r,int x){
if(init(L,R,l,r)) maketag(u,l,r,x);
else if(outit(L,R,l,r)) return;
else{
pushdown(u,l,r,lzy[u]);
int mid=l+r>>1;
update(u*2,L,R,l,mid,x);
update(u*2+1,L,R,mid+1,r,x);
pushup(u);
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>amm[i];
build(1,1,n);
for(int i=1;i<=m;i++){
cin>>id;
if(id==1){
cin>>x>>y;
find(1,1,n,x,y);
}
else{
cin>>x;
update(1,1,n,1,n,x);
}
cout<<tree[1]<<endl;
}
return 0;
}
由于每一次的错误都在1操作后,因此怀疑find(即单点查询)有问题,但找不到,有大佬帮帮忙吗?