/* created by chjshen, date: 2023-12-08 10:13 */
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = 5E4 + 5;
int n, opt, c;
long long a[N], add[N], b[N];
int l[N], r[N], pos[N];
int blockLen, blockNum;
void query(int L, int R)
{
    int ans = 0;
    long long C = 1LL * c * c;
    int p = pos[L], q = pos[R];
    if (p == q)
    {
        for (int i = L; i <= R; i++)
            if (a[i] + add[p] < C) ans++;
    }
    else
    {
        for (int i = p + 1; i <= q - 1; i++)
        {
            // binary_search
            int res = -1;
            int left = l[i], right = r[i];
            while (left <= right)
            {
                int mid = (right + left) / 2;
                if (b[mid] + add[i] < C)
                {
                    left = mid + 1;
                    res = mid;
                }
                else
                    right = mid - 1;
            }
            if (res != -1)
            {
                ans += (res - l[i] + 1);
            }
        }
        for (int i = L; i <= r[p]; i++)
            if (a[i] + add[p] < C) ans++;
        for (int i = l[q]; i <= R; i++)
            if (a[i] + add[q] < C) ans++;
    }
    printf("%d\n", ans);
}
void modify(int L, int R)
{
    int p = pos[L], q = pos[R];
    if (p == q)
    {
        for (int i = L; i <= R; i++) a[i] += c;
        for (int i = l[p]; i <= r[p]; i++) b[i] = a[i];
        sort(b + l[p], b + r[p] + 1);
    }
    else
    {
        for (int i = p + 1; i <= q - 1; i++) add[i] += c;
        for (int i = L; i <= r[p]; i++) a[i] += c;
        for (int i = l[p]; i <= r[p]; i++) b[i] = a[i];
        sort(b + l[p], b + r[p] + 1);
        for (int i = l[q]; i <= R; i++) a[i] += c;
        for (int i = l[q]; i <= r[q]; i++) b[i] = a[i];
        sort(b + l[q], b + r[q] + 1);
    }
}
void handle()
{
    for (int i = 1; i <= n; i++)
    {
        int l, r;
        scanf("%d%d%d%d", &opt, &l, &r, &c);
        if (opt == 0)
            modify(l, r);
        else
            query(l, r);
    }
}
void initInput()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%lld", &a[i]), b[i] = a[i];
    // block init
    blockNum = sqrt(n);
    blockLen = n / blockNum;
    for (int i = 1; i <= blockNum; i++)
    {
        l[i] = (i - 1) * blockLen + 1;
        r[i] = i * blockLen;
        for (int j = l[i]; j <= r[i]; j++) pos[j] = i;
        sort(b + l[i], b + r[i] + 1);
    }
    if (n > blockNum * blockLen)
    {
        blockNum++;
        l[blockNum] = (blockNum - 1) * blockLen + 1;
        r[blockNum] = n;
        sort(b + l[blockNum], b + n + 1);
        for (int j = l[blockNum]; j <= n; j++) pos[j] = blockNum;
    }
}
int main(void)
{
    initInput();
    handle();
    return 0;
}

2 条评论

  • 1

信息

ID
2597
时间
1000ms
内存
256MiB
难度
7
标签
递交数
131
已通过
26
上传者