#include <bits/stdc++.h>
using namespace std;
#define ls k<<1
#define rs k<<1|1
const int N = 8e5+10;
long long n, m;
long long f[N], s[N], a[N], len[N], tag[N];
void build(int k, int l, int r)
{
if(l==r) {f[k] = s[k] = a[l];len[k] = 1;return;}
int mid = l+r>>1;
build(ls, l, mid);
build(rs, mid+1, r);
f[k] = min(f[ls], f[rs]);
s[k] = s[ls]+s[rs];
len[k] = len[ls]+len[rs];
}
void push_down(int k, int l, int r)
{
if(!tag[k]) return;
s[ls] += len[ls]*tag[k];
f[ls] += tag[k];
tag[ls] += tag[k];
s[rs] += len[rs]*tag[k];
f[rs] += tag[k];
tag[rs] += tag[k];
tag[k] = 0;
}
void update(int k, int l, int r, int x, int y, int v)
{
if(x<=l&&r<=y)
{
f[k] += v;
s[k] += len[k]*v;
tag[k] += v;
return;
}
push_down(k, l, r);
int mid = l+r>>1;
if(mid>=x) update(ls, l, mid, x, y, v);
if(mid<y) update(rs, mid+1, r, x, y, v);
f[k] = min(f[ls], f[rs]);
s[k] = s[ls]+s[rs];
}
long long query(int k, int l, int r, int x, int y, int ty)
{
if(x<=l&&r<=y)
{
if(ty) return s[k];
return f[k];
}
long long mid = l+r>>1, res1 = 0, res2 = 3e20+10;
if(mid>=x) res1 = query(ls, l, mid, x, y, ty), res2 = res1;
if(mid<y)
{
long long t = query(rs, mid+1, r, x, y, ty);
res1 += t, res2 = min(res2, t);
}
if(ty) return res1;
return res2;
}
int main()
{
cin >> n >> m;
for(int i=1;i<=4*n;i++) f[i] = 3e20+10;
for(int i=1;i<=n;i++) cin >> a[i];
build(1, 1, n);
for(int i=1;i<=m;i++)
{
char op;
int x, y, z;
cin >> op >> x >> y;
if(op=='M') cout << query(1, 1, n, x, y, 0) << endl;
else if(op=='S') cout << query(1, 1, n, x, y, 1) << endl;
else//add
{
cin >> z;
update(1, 1, n, x, y, z);
}
}
return 0;
}
rt,lz原本准备10分钟打完,愣是被调了半小时也没发现错哪...
只有第一个点对了,其他全WA