1 条题解
-
0

#include <bits/stdc++.h> #define N 512202 #define INF 0x2c9d526cd03581ell using namespace std; typedef long long ll; template <typename T> struct ST{ int sz; struct node{int l, r; T v0, v1, m0, m1;}*x; ST (int size = 100){x = 0; resize(size);} ~ST (){delete(x);} void resize(int size){sz = size; if(x) delete(x); x = new node[sz << 2]; memset(x, 0, (sz << 2) * sizeof(T));} void init(){build(1, 1, sz);} void add(int l, int r, T v){add(1, 1, sz, l, r, v);} void sub(int l, int r, T v){sub(1, 1, sz, l, r, v);} T qry(int h, T v){int id = find(1, 1, sz, h); return max(v + x[id].v0, x[id].v1);} T his(int h, T v){int id = find(1, 1, sz, h); return max(v + x[id].m0, x[id].m1);} ////////////////////////////////// inline void up(T &a, T b){a < b ? a = b : b;} void build(int id, int L, int R){ x[id].v0 = x[id].v1 = x[id].m0 = x[id].m1 = 0; if(L < R){ int M = L + R - 1 >> 1; build(id << 1, L, M); build(id << 1 | 1, M + 1, R); } } void update(int id){ up(x[id].v0, -INF); up(x[id].v1, -INF); up(x[id].m0, x[id].v0); up(x[id].m1, x[id].v1); } void push_down(int id, int Lc, int Rc){ up(x[Lc].m0, x[Lc].v0 + x[id].m0); up(x[Rc].m0, x[Rc].v0 + x[id].m0); up(x[Lc].m1, max(x[id].m1, x[Lc].v1 + x[id].m0)); up(x[Rc].m1, max(x[id].m1, x[Rc].v1 + x[id].m0)); x[Lc].v0 += x[id].v0; x[Rc].v0 += x[id].v0; x[Lc].v1 += x[id].v0; x[Rc].v1 += x[id].v0; up(x[Lc].v1, x[id].v1); up(x[Rc].v1, x[id].v1); x[id].v0 = x[id].v1 = x[id].m0 = x[id].m1 = 0; update(Lc); update(Rc); } void add(int id, int L, int R, int ql, int qr, T v){ if(R < ql || qr < L) return; if(ql <= L && R <= qr){x[id].v0 += v; x[id].v1 += v; update(id); return;} int M = L + R - 1 >> 1, Lc = id << 1, Rc = Lc | 1; push_down(id, Lc, Rc); if(ql <= M) add(Lc, L, M, ql, qr, v); if(qr > M) add(Rc, M + 1, R, ql, qr, v); } void sub(int id, int L, int R, int ql, int qr, T v){ if(R < ql || qr < L) return; if(ql <= L && R <= qr){x[id].v0 -= v; x[id].v1 -= v; up(x[id].v1, 0); update(id); return;} int M = L + R - 1 >> 1, Lc = id << 1, Rc = Lc | 1; push_down(id, Lc, Rc); if(ql <= M) sub(Lc, L, M, ql, qr, v); if(qr > M) sub(Rc, M + 1, R, ql, qr, v); } int find(int id, int L, int R, int h){ if(L == R) return id; int M = L + R - 1 >> 1, Lc = id << 1, Rc = Lc | 1; push_down(id, Lc, Rc); if(h <= M) return find(Lc, L, M, h); if(h > M) return find(Rc, M + 1, R, h); } }; int n, q, i; int a[N]; int ch, l, r, h; ll x; ST <ll> s; int main(){ scanf("%d%d", &n, &q); s.resize(n); for(i = 1; i <= n; i++) scanf("%d", a + i); s.init(); for(; q; q--){ switch(scanf("%d", &ch), ch){ case 1: scanf("%d%d%lld", &l, &r, &x); s.add(l, r, x); break; case 2: scanf("%d%d%lld", &l, &r, &x); s.sub(l, r, x); break; case 3: scanf("%d%d%lld", &l, &r, &x); s.sub(l, r, INF); s.add(l, r, x); break; case 4: scanf("%d", &h); printf("%lld\n", s.qry(h, (ll)a[h])); break; case 5: scanf("%d", &h); printf("%lld\n", s.his(h, (ll)a[h])); break; } } return 0; }
- 1
信息
- ID
- 579
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 240
- 已通过
- 66
- 上传者