查看不能折叠的水代码
#include<stdio.h> struct { int s, e; long long int s1, s2; } x[262144]; void set(int s, int e, int t) { x[t].s = s; x[t].e = e; if (s != e) { set(s, (s + e) >> 1, (t << 1) + 1); set(((s + e) >> 1) + 1, e, (t << 1) + 2); } } long long int CQ(int s, int e, long long int a, int t) { int m; long long int n; x[t].s1 += a * (e - s + 1); if ((x[t].s == s) && (x[t].e == e)) { x[t].s2 += a; return x[t].s1; } else { m = (x[t].s + x[t].e) >> 1; n = (s <= m) ? CQ(s, (m < e ? m : e), a, (t << 1) + 1) : 0; n += (e > m) ? CQ((m >= s ? m + 1 : s), e, a, (t << 1) + 2) : 0; return x[t].s2 * (e - s + 1) + n; } } int main() { int n, m, i; long long int a; char c; scanf("%d %d", &n, &m); set(1, n, 0); for (i = 1; i <= n; i++) { scanf("%lld", &a); CQ(i, i, a, 0); } while (m--) { getchar(); scanf("%c %d %d", &c, &i, &n); if (c == 'Q') printf("%lld\n", CQ(i, n, 0, 0)); else { scanf("%lld", &a); CQ(i, n, a, 0); } } return 0; }
以后做题一定要注意取值范围。。。谨以此题为戒。