分块100pts WA on #1悬关求调
查看原帖
分块100pts WA on #1悬关求调
1476288
lyb_qhd楼主2025/7/19 10:46
#include<bits/stdc++.h>
#define fil [[gnu::always_inline]] inline
#define up(i,l,r) for(long long i=(l),E##i=(r);i<=E##i;++i)
#define dn(i,r,l) for(long long i=(r),E##i=(l);i>=E##i;--i)
using namespace std; typedef long long ll;
constexpr ll MAXB = 710, N = 5 + 5e5 + 2 * MAXB;

ll n, B, C;
array<ll, N> a, m;
array<ll, MAXB> b, l, r;

fil ll ri();
fil void build(), add(ll, ll), query(ll, ll);

int main() {
    ll q, t, x, y;

    n = ri(); q = ri();
    up (i, 1, n) a[i] = ri();
    build();
    // up (i, 1, n) printf("|%lld %lld %lld \n", i, a[i], m[i]);
    // up (i, 1, C) printf("|%lld %lld %lld %lld \n", i, b[i], l[i], r[i]);
    while (q--) {
        t = ri(); x = ri(); y = ri();
        // printf("|%lld %lld %lld \n", t, x, y);
        (t == 1) ? add(x, y) : query(x, y);
    }
}

fil void build() {
    B = ceil(sqrtl(n)); C = (n + B - 1) / B;
    up (j, 1, C - 1) up (i, l[j] = r[j - 1] + 1, r[j] = j * B) {
        m[i] = j;
        b[j] += a[i];
    }
    up (i, l[C] = r[C-1]+1, r[C] = n) {
        m[i] = C;
        b[C] += a[i];
    }
}
fil void add(ll i, ll x) {
    a[i] += x;
    b[m[i]] += x;
}
fil ll rget(ll x, ll y, ll ret = 0) {
    up (i, x, y) ret += a[i];
    return ret;
}
fil void query(ll x, ll y) {
    if (m[x] == m[y]) return (void) printf("%lld\n", rget(x, y));
    ll ret = rget(x, r[m[x]]) + rget(l[m[y]], y);
    for (ll j = m[x] + 1; j < m[y]; ++j) ret += b[j];
    printf("%lld\n", ret);
}

#define g (p==q?q=(p=b)+fread(b,1,sizeof b,stdin),c=*(p++):(c=*(p++)))
inline ll ri() {
    static char b[1 << 20], *p = b, *q = b, c = 0;
    static ll x; static bool s;
    for (x = s = 0; '0' > c || c > '9'; g) if (c == '-') s = !s;
    while ('0' <= c && c <= '9') x = (x << 3) + (x << 1) + (c ^ '0'), g;
    return s ? -x : x;
}
#undef g
2025/7/19 10:46
加载中...