RT, 记录。
代码如下。
#include <iostream>
#include <cstdio>
using namespace std;
#define int long long
#define N 200010
int n, m, spc;
int read() {
int x = 0, f = 1;
char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') {
f *= - 1; c = getchar();
}
}
while(c >= '0' && c <= '9') {
x = x * 10 + (c - '0');
c = getchar();
}
if(c == ' ') spc ++;
return x * f;
}
int d[N * 4], lzy[N * 4], a[N];
void build(int l, int r, int p) {
if(l == r) {
d[p] = a[l];
return;
}
int m = l + (r - l) / 2;
build(l, m, p * 2);
build(m + 1, r, p * 2 + 1);
d[p] = std::min(d[p * 2], d[p * 2 + 1]);
}
void maketag(int p, int len, int x) {
d[p] += len * x; lzy[p] += x;
}
void pushdown(int l, int r, int p) {
int m = l + (r - l) / 2;
maketag(p * 2, m - l + 1, lzy[p]);
maketag(p * 2 + 1, r - m, lzy[p]);
lzy[p] = 0;
}
void update(int l, int r, int L, int R, int p, int x) {
if(L <= l && r <= R) {
maketag(p, r - l + 1, x);
return;
}
int m = l + (r - l) / 2;
pushdown(l, r, p);
if(m < R) update(m + 1, r, L, R, p * 2 + 1, x);
if(m >= L) update(l, m, L, R, p * 2, x);
d[p] = std::min(d[p * 2], d[p * 2 + 1]);
}
int query(int l, int r, int L, int R, int p) {
if(L <= l && r <= R) return d[p];
int m = l + (r - l) / 2, res = 0x3f3f3f3f;
pushdown(l, r, p);
if(m >= L) res = std::min(res, query(l, m, L, R, p * 2));
if(m < R) res = std::min(res, query(m + 1, r, L, R, p * 2 + 1));
return res;
}
void check() {
for(int i = 1; i <= n; i ++) cout << a[i] << " ";
cout << "\n";
}
signed main() {
n = read();
for(int i = 1; i <= n; i ++) a[i] = read();
m = read();
build(1, n, 1);
while(m --) {
spc = 0;
int x = read(), y = read();
x ++, y ++;
if(spc == 2) {
int z = read();
if(x <= y) update(1, n, x, y, 1, z);
else {
update(1, n, x, n, 1, z);
update(1, n, 1, y, 1, z);
}
}
else {
if(x <= y) cout << query(1, n, x, y, 1) << "\n";
else {
cout << std::min(query(1, n, x, n, 1), query(1, n, 1, y, 1)) << "\n";
}
}
}
return 0;
}
可能不能及时回复请见谅。