全WA,样例下载下来是爆long long了(样例#1)
#include <bits/stdc++.h>
using namespace std;
const int N = 100005; //6
struct TAG {
long long k, d;
} tag[4 * N];
long long n, m, tree[4 * N], a, b, c, d, e, z[N];
long long ls(long long k) {
return k * 2;
}
long long rs(long long k) {
return k * 2 + 1;
}
void up_update(long long rt) {
tree[rt] = tree[ls(rt)] + tree[rs(rt)];
}
void add_tag(long long dl, long long dr, long long K, long long D, long long rt) {
tag[rt].k += K;
tag[rt].d += D;
tree[rt] += (dr - dl + 1) * K + ((dr - dl + 1) * (dr - dl) / 2) * D;
}
void down_update(long long rt, long long l, long long r) {
if (tag[rt].k != 0) {
long long mid = (l + r) / 2;
add_tag(l, mid, tag[rt].k, tag[rt].d, ls(rt));
add_tag(mid + 1, r, tag[rt].k + (mid + 1 - r)*tag[rt].d, tag[rt].d, rs(rt));
tag[rt].k = 0;
tag[rt].d = 0;
}
return;
}
void begintree(long long l, long long r, long long rt) {
tag[rt].k = 0;
tag[rt].d = 0;
if (l == r) {
tree[rt] = z[l];
return;
}
long long mid = (l + r) / 2;
begintree(l, mid, ls(rt));
begintree(mid + 1, r, rs(rt));
up_update(rt);
return;
}
void qj_num(long long dl, long long dr, long long l, long long r, long long K, long long D, long long rt) {
if (l <= dl && dr <= r) {
add_tag(dl, dr, K + (dl - l)*D, D, rt);
return;
}
down_update(rt, dl, dr);
long long mid = (dl + dr) / 2;
if (l <= mid) qj_num(dl, mid, l, r, K, D, ls(rt));
if (r > mid) qj_num(mid + 1, dr, l, r, K, D, rs(rt));
up_update(rt);
return;
}
long long print_num(long long dl, long long dr, long long l, long long r, long long rt) {
if (l <= dl && dr <= r) {
return tree[rt];
}
down_update(rt, dl, dr);
long long mid = (dl + dr) / 2, res = 0;
if (l <= mid) res += print_num(dl, mid, l, r, ls(rt));
if (r > mid) res += print_num(mid + 1, dr, l, r, rs(rt));
return res;
}
int main() {
freopen("in.in","r",stdin);
scanf("%lld%lld", &n, &m);
for (int i = 1; i <= n; i++) scanf("%lld", &z[i]);
begintree(1, n, 1);
for (int i = 1; i <= m; i++) {
scanf("%lld%lld", &a, &b);
if (a == 1) {
scanf("%lld%lld%lld", &c, &d, &e);
qj_num(1, n, b, c, d, e, 1);
} else {
printf("%lld\n", print_num(1, n, b, b, 1));
}
}
return 0;
}