序列長度 n,初始值給定。操作:
1 a b s:區間 [a,b] 加 s。
2 s:查詢位置 s 當前值。
多測試案例,n≤100000,操作數 q 同量級。
#define lson rt<<1, l, mid
#define rson rt<<1|1, mid+1, r
int sum[MAXN*4], lazy[MAXN*4];
void pushDown(int rt) {
if (lazy[rt]) {
lazy[rt<<1] += lazy[rt]; sum[rt<<1] += lazy[rt];
lazy[rt<<1|1] += lazy[rt]; sum[rt<<1|1] += lazy[rt];
lazy[rt] = 0;
}
}
void build(int rt, int l, int r) {
sum[rt]=lazy[rt]=0;
if (l==r) return;
int mid=(l+r)>>1; build(lson); build(rson);
}
void update(int rt, int l, int r, int L, int R, int v) {
if (L<=l && r<=R) { sum[rt]+=v; lazy[rt]+=v; return; }
int mid=(l+r)>>1; pushDown(rt);
if (L<=mid) update(lson, L, R, v);
if (R>mid) update(rson, L, R, v);
// 無需 pushUp
}
int query(int rt, int l, int r, int pos) {
if (l==r) return sum[rt];
int mid=(l+r)>>1; pushDown(rt);
if (pos<=mid) return query(lson, pos);
else return query(rson, pos);
}