Section 4.4
parent
bb5db70ffd
commit
0050bc4d6a
@ -1,53 +0,0 @@
|
||||
#include <cstdio>
|
||||
typedef long long int64;
|
||||
#define lch(x) ((x) << 1)
|
||||
#define rch(x) ((x) << 1 | 1)
|
||||
#define avg(x, y) (((x) + (y)) >> 1)
|
||||
inline int min(int a, int b)
|
||||
{
|
||||
return a < b ? a : b;
|
||||
}
|
||||
inline int max(int a, int b) { return a > b ? a : b; }
|
||||
const int N = 100010;
|
||||
int64 sum[N << 2], add[N << 2], a[N];
|
||||
void build(int k, int l, int r)
|
||||
{
|
||||
if (l + 1 == r) return void(sum[k] = a[l]);
|
||||
int m = avg(l, r);
|
||||
build(lch(k), l, m);
|
||||
build(rch(k), m, r);
|
||||
sum[k] += sum[lch(k)] + sum[rch(k)];
|
||||
}
|
||||
void modify(int k, int l, int r, int x, int y, int v)
|
||||
{
|
||||
if (x <= l && r <= y) return void(add[k] += v);
|
||||
sum[k] += (min(r, y) - max(l, x)) * v;
|
||||
int m = avg(l, r);
|
||||
if (x < m) modify(lch(k), l, m, x, y, v);
|
||||
if (y > m) modify(rch(k), m, r, x, y, v);
|
||||
}
|
||||
int64 query(int k, int l, int r, int x, int y)
|
||||
{
|
||||
if (x <= l && r <= y) return sum[k] + (r - l) * add[k];
|
||||
int m = avg(l, r);
|
||||
return (min(r, y) - max(l, x)) * add[k] +
|
||||
(x < m ? query(lch(k), l, m, x, y) : 0) +
|
||||
(y > m ? query(rch(k), m, r, x, y) : 0);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n, m, op1, op2, op3;
|
||||
char op[2];
|
||||
scanf("%d%d", &n, &m);
|
||||
for (int i = 0; i < n; i++) scanf("%lld", a + i);
|
||||
build(1, 0, n);
|
||||
while (m--)
|
||||
{
|
||||
scanf("%s%d%d", op, &op1, &op2);
|
||||
if (op[0] == 'Q')
|
||||
printf("%lld\n", query(1, 0, n, op1 - 1, op2));
|
||||
else
|
||||
scanf("%d", &op3), modify(1, 0, n, op1 - 1, op2, op3);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,70 @@
|
||||
#include <cctype>
|
||||
#include <cstdio>
|
||||
#define C(x) ((x) = getchar())
|
||||
#define L(x) ((x) << 1)
|
||||
#define R(x) ((x) << 1 | 1)
|
||||
#define avg(x, y) (((x) + (y)) >> 1)
|
||||
typedef long long i64;
|
||||
inline int max(int a, int b) { return a > b ? a : b; }
|
||||
inline int min(int a, int b) { return a < b ? a : b; }
|
||||
inline void read(int &x)
|
||||
{
|
||||
int ch = x = 0, sign = 1;
|
||||
while (!isdigit(C(ch))) if (ch == '-') sign = -1;
|
||||
for (; isdigit(ch); C(ch))
|
||||
x = x * 10 + ch - '0';
|
||||
x *= sign;
|
||||
}
|
||||
const int N = int(1e5 + 5);
|
||||
i64 add[N << 2], sum[N << 2];
|
||||
int a[N];
|
||||
void build(int k, int l, int r)
|
||||
{
|
||||
if (l == r - 1) return void(sum[k] = a[l]);
|
||||
int m = avg(l, r);
|
||||
build(L(k), l, m);
|
||||
build(R(k), m, r);
|
||||
sum[k] = sum[L(k)] + sum[R(k)];
|
||||
}
|
||||
void modify(int k, int l, int r, int x, int y, int v)
|
||||
{
|
||||
if (x <= l && r <= y)
|
||||
return void(add[k] += v);
|
||||
sum[k] += 1ll * (min(r, y) - max(l, x)) * v;
|
||||
int m = avg(l, r);
|
||||
if (x < m) modify(L(k), l, m, x, y, v);
|
||||
if (y > m) modify(R(k), m, r, x, y, v);
|
||||
}
|
||||
i64 query(int k, int l, int r, int x, int y)
|
||||
{
|
||||
if (x <= l && r <= y)
|
||||
return sum[k] + (r - l) * add[k];
|
||||
int m = avg(l, r);
|
||||
i64 res = add[k] * (min(r, y) - max(l, x));
|
||||
if (x < m) res += query(L(k), l, m, x, y);
|
||||
if (y > m) res += query(R(k), m, r, x, y);
|
||||
return res;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n, m;
|
||||
read(n), read(m);
|
||||
for (int i = 0; i < n; i++) read(a[i]);
|
||||
build(1, 0, n);
|
||||
while (m--)
|
||||
{
|
||||
int op = 0, x, y, z;
|
||||
while (op != 'C' && op != 'Q') C(op);
|
||||
if (op == 'Q')
|
||||
{
|
||||
read(x), read(y);
|
||||
printf("%lld\n", query(1, 0, n, x - 1, y));
|
||||
}
|
||||
else
|
||||
{
|
||||
read(x), read(y), read(z);
|
||||
modify(1, 0, n, x - 1, y, z);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,81 @@
|
||||
#include <cstdio>
|
||||
#include <cctype>
|
||||
#define C(x) (x = getchar())
|
||||
#define L(x) ((x) << 1)
|
||||
#define R(x) ((x) << 1 | 1)
|
||||
#define avg(x, y) (((x) + (y)) >> 1)
|
||||
inline void read(int &x)
|
||||
{
|
||||
int ch = x = 0, flag = 1;
|
||||
while (!isdigit(C(ch))) if (ch == '-') flag = -1;
|
||||
for (; isdigit(ch); C(ch))
|
||||
x = x * 10 + ch - '0';
|
||||
x *= flag;
|
||||
}
|
||||
const int N = int(1e5 + 5);
|
||||
typedef long long i64;
|
||||
int a[N];
|
||||
i64 A[N << 2], S[N << 2];
|
||||
inline void add(int k, int l, int r, i64 v)
|
||||
{
|
||||
A[k] += v;
|
||||
S[k] += (r - l) * v;
|
||||
}
|
||||
inline void pushdown(int k, int l, int r)
|
||||
{
|
||||
if (A[k] == 0) return;
|
||||
int m = avg(l, r);
|
||||
add(L(k), l, m, A[k]);
|
||||
add(R(k), m, r, A[k]);
|
||||
A[k] = 0;
|
||||
}
|
||||
void build(int k, int l, int r)
|
||||
{
|
||||
if (l == r - 1) return void(S[k] = a[l]);
|
||||
int m = avg(l, r);
|
||||
build(L(k), l, m);
|
||||
build(R(k), m, r);
|
||||
S[k] = S[L(k)] + S[R(k)];
|
||||
}
|
||||
i64 query(int k, int l, int r, int x, int y)
|
||||
{
|
||||
if (x <= l && r <= y) return S[k];
|
||||
pushdown(k, l, r);
|
||||
int m = avg(l, r);
|
||||
i64 res = 0;
|
||||
if (x < m) res += query(L(k), l, m, x, y);
|
||||
if (y > m) res += query(R(k), m, r, x, y);
|
||||
return res;
|
||||
}
|
||||
void modify(int k, int l, int r, int x, int y, int v)
|
||||
{
|
||||
if (x <= l && r <= y) return add(k, l, r, v);
|
||||
int m = avg(l, r);
|
||||
pushdown(k, l, r);
|
||||
if (x < m) modify(L(k), l, m, x, y, v);
|
||||
if (y > m) modify(R(k), m, r, x, y, v);
|
||||
S[k] = S[L(k)] + S[R(k)];
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n, m;
|
||||
read(n), read(m);
|
||||
for (int i = 0; i < n; i++) read(a[i]);
|
||||
build(1, 0, n);
|
||||
while (m--)
|
||||
{
|
||||
int op = 0, x, y, z;
|
||||
while (op != 'Q' && op != 'C') C(op);
|
||||
if (op == 'Q')
|
||||
{
|
||||
read(x), read(y);
|
||||
printf("%lld\n", query(1, 0, n, x - 1, y));
|
||||
}
|
||||
else
|
||||
{
|
||||
read(x), read(y), read(z);
|
||||
modify(1, 0, n, x - 1, y, z);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,70 @@
|
||||
#include <cctype>
|
||||
#include <cstdio>
|
||||
#define C(x) ((x) = getchar())
|
||||
#define L(x) ((x) << 1)
|
||||
#define R(x) ((x) << 1 | 1)
|
||||
#define avg(x, y) (((x) + (y)) >> 1)
|
||||
typedef long long i64;
|
||||
inline int max(int a, int b) { return a > b ? a : b; }
|
||||
inline int min(int a, int b) { return a < b ? a : b; }
|
||||
inline void read(int &x)
|
||||
{
|
||||
int ch = x = 0, sign = 1;
|
||||
while (!isdigit(C(ch))) if (ch == '-') sign = -1;
|
||||
for (; isdigit(ch); C(ch))
|
||||
x = x * 10 + ch - '0';
|
||||
x *= sign;
|
||||
}
|
||||
const int N = int(1e5 + 5);
|
||||
i64 add[N << 2], sum[N << 2];
|
||||
int a[N];
|
||||
void build(int k, int l, int r)
|
||||
{
|
||||
if (l == r - 1) return void(sum[k] = a[l]);
|
||||
int m = avg(l, r);
|
||||
build(L(k), l, m);
|
||||
build(R(k), m, r);
|
||||
sum[k] = sum[L(k)] + sum[R(k)];
|
||||
}
|
||||
void modify(int k, int l, int r, int x, int y, int v)
|
||||
{
|
||||
if (x <= l && r <= y)
|
||||
return void(add[k] += v);
|
||||
sum[k] += 1ll * (min(r, y) - max(l, x)) * v;
|
||||
int m = avg(l, r);
|
||||
if (x < m) modify(L(k), l, m, x, y, v);
|
||||
if (y > m) modify(R(k), m, r, x, y, v);
|
||||
}
|
||||
i64 query(int k, int l, int r, int x, int y)
|
||||
{
|
||||
if (x <= l && r <= y)
|
||||
return sum[k] + (r - l) * add[k];
|
||||
int m = avg(l, r);
|
||||
i64 res = add[k] * (min(r, y) - max(l, x));
|
||||
if (x < m) res += query(L(k), l, m, x, y);
|
||||
if (y > m) res += query(R(k), m, r, x, y);
|
||||
return res;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n, m;
|
||||
read(n), read(m);
|
||||
for (int i = 0; i < n; i++) read(a[i]);
|
||||
build(1, 0, n);
|
||||
while (m--)
|
||||
{
|
||||
int op = 0, x, y, z;
|
||||
while (op != 'C' && op != 'Q') C(op);
|
||||
if (op == 'Q')
|
||||
{
|
||||
read(x), read(y);
|
||||
printf("%lld\n", query(1, 0, n, x - 1, y));
|
||||
}
|
||||
else
|
||||
{
|
||||
read(x), read(y), read(z);
|
||||
modify(1, 0, n, x - 1, y, z);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,15 @@
|
||||
struct node
|
||||
{
|
||||
int val, dis;
|
||||
node *ch[2];
|
||||
};
|
||||
#define dis(x) ((x) ? (x)->dis : -1)
|
||||
node *merge(node *a, node *b)
|
||||
{
|
||||
if (a && b) return (node*)(uintptr_t(a) | uintptr_t(b));
|
||||
if (a->val < b->val) swap(a, b);
|
||||
a->ch[1] = merge(a->ch[1], b);
|
||||
if (dis(a->ch[0]) < dis(a->ch[1])) swap(a->ch[0], a->ch[1]);
|
||||
a->dis = dis(a->ch[1]) + 1;
|
||||
return a;
|
||||
}
|
||||
@ -0,0 +1,81 @@
|
||||
#include <cstdio>
|
||||
#include <cctype>
|
||||
#define C(x) (x = getchar())
|
||||
#define L(x) ((x) << 1)
|
||||
#define R(x) ((x) << 1 | 1)
|
||||
#define avg(x, y) (((x) + (y)) >> 1)
|
||||
inline void read(int &x)
|
||||
{
|
||||
int ch = x = 0, flag = 1;
|
||||
while (!isdigit(C(ch))) if (ch == '-') flag = -1;
|
||||
for (; isdigit(ch); C(ch))
|
||||
x = x * 10 + ch - '0';
|
||||
x *= flag;
|
||||
}
|
||||
const int N = int(1e5 + 5);
|
||||
typedef long long i64;
|
||||
int a[N];
|
||||
i64 A[N << 2], S[N << 2];
|
||||
inline void add(int k, int l, int r, i64 v)
|
||||
{
|
||||
A[k] += v;
|
||||
S[k] += (r - l) * v;
|
||||
}
|
||||
inline void pushdown(int k, int l, int r)
|
||||
{
|
||||
if (A[k] == 0) return;
|
||||
int m = avg(l, r);
|
||||
add(L(k), l, m, A[k]);
|
||||
add(R(k), m, r, A[k]);
|
||||
A[k] = 0;
|
||||
}
|
||||
void build(int k, int l, int r)
|
||||
{
|
||||
if (l == r - 1) return void(S[k] = a[l]);
|
||||
int m = avg(l, r);
|
||||
build(L(k), l, m);
|
||||
build(R(k), m, r);
|
||||
S[k] = S[L(k)] + S[R(k)];
|
||||
}
|
||||
i64 query(int k, int l, int r, int x, int y)
|
||||
{
|
||||
if (x <= l && r <= y) return S[k];
|
||||
pushdown(k, l, r);
|
||||
int m = avg(l, r);
|
||||
i64 res = 0;
|
||||
if (x < m) res += query(L(k), l, m, x, y);
|
||||
if (y > m) res += query(R(k), m, r, x, y);
|
||||
return res;
|
||||
}
|
||||
void modify(int k, int l, int r, int x, int y, int v)
|
||||
{
|
||||
if (x <= l && r <= y) return add(k, l, r, v);
|
||||
int m = avg(l, r);
|
||||
pushdown(k, l, r);
|
||||
if (x < m) modify(L(k), l, m, x, y, v);
|
||||
if (y > m) modify(R(k), m, r, x, y, v);
|
||||
S[k] = S[L(k)] + S[R(k)];
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n, m;
|
||||
read(n), read(m);
|
||||
for (int i = 0; i < n; i++) read(a[i]);
|
||||
build(1, 0, n);
|
||||
while (m--)
|
||||
{
|
||||
int op = 0, x, y, z;
|
||||
while (op != 'Q' && op != 'C') C(op);
|
||||
if (op == 'Q')
|
||||
{
|
||||
read(x), read(y);
|
||||
printf("%lld\n", query(1, 0, n, x - 1, y));
|
||||
}
|
||||
else
|
||||
{
|
||||
read(x), read(y), read(z);
|
||||
modify(1, 0, n, x - 1, y, z);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
Binary file not shown.
Loading…
Reference in new issue