简单的线段树操作
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e6 + 10;
LL sum[maxn<<2],maxx[maxn<<2],minn[maxn<<2];
LL sum1,max1 = -LLONG_MAX,min1 = LLONG_MAX;
void up(int id){
sum[id] = sum[id<<1] + sum[id<<1|1];
maxx[id] = max(maxx[id<<1] , maxx[id<<1|1]);
minn[id] = min(minn[id<<1] , minn[id<<1|1]);
}
void rev(int l,int r,int id,int x,int c){
if (l == r){
sum[id] = minn[id] = maxx[id] = c;
return;
}
int mid = (l + r) >> 1;
if (x <= mid) rev(l, mid, id<<1, x, c);
if (x > mid) rev(mid+1, r, id<<1|1,x ,c);
up(id);
}
void query(int l,int r,int id,int L,int R){
if (L <= l && r <= R){
sum1 += sum[id];
max1 = max(max1, maxx[id]);
min1 = min(min1, minn[id]);
return;
}
int mid = (l + r) >> 1;
if (L <= mid) query(l, mid, id<<1, L, R);
if (R > mid) query(mid+1, r, id<<1|1, L, R);
}
int main(){
int o,x,y,n,m;
scanf("%d%d",&n,&m);
for (int i=0; i<m; i++) {
scanf("%d%d%d",&o,&x,&y);
if (o == 0){
rev(1, n, 1, x, y);
}else if (o == 1){
query(1, n, 1, x, y);
printf("%lld\n",sum1-max1-min1);
sum1 = 0; max1 = -LLONG_MAX; min1 = LLONG_MAX;
}
}
return 0;
}