比赛 2024.5.23练习赛 评测结果 AAAAAAAAAA
题目名称 新年快乐! 最终得分 100
用户昵称 darkMoon 运行时间 6.080 s
代码语言 C++ 内存使用 5.63 MiB
提交时间 2024-05-27 08:34:38
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
ifstream fin("dss.in");
ofstream fout("dss.out");
auto mread = [](){int x;fin >> x;return x;};
const int N = 1e5 + 5;
int n = mread(), a[N], b[N], belong[N], q;
struct node{
    int l, r, k;
}s[1005];
void add(int l, int r, int v){
    int x = belong[l], y = belong[r];
    if(x == y){
        for(int i = l; i <= r; i ++)
        a[i] += v;
        for(int i = s[x].l; i <= s[x].r; i ++)
        b[i] = a[i];
        sort(b + s[x].l, b + 1 + s[x].r);
        return;
    }
    for(int i = x + 1; i < y; i ++)
    s[i].k += v;
    for(int i = l; i <= s[x].r; i ++){
        a[i] += v;
    }
    for(int i = s[y].l; i <= r; i ++){
        a[i] += v;
    }
    for(int i = s[x].l; i <= s[x].r; i ++)
    b[i] = a[i];
    sort(b + s[x].l, b + 1 + s[x].r);
    for(int i = s[y].l; i <= s[y].r; i ++)
    b[i] = a[i];
    sort(b + s[y].l, b + 1 + s[y].r);
    return;
}
int query(int l, int r, int k){
    int x = belong[l], y = belong[r], ans = 0;
    if(x == y){
        for(int i = l; i <= r; i ++){
            if(a[i] + s[x].k <= k)
            ans ++;
        }
        return ans;
    }
    for(int i = x + 1; i < y; i ++){
        ans += ((upper_bound(b + s[i].l, b + s[i].r + 1, k - s[i].k) - (b + s[i].l)));
    }
    for(int i = l; i <= s[x].r; i ++){
        if(a[i] + s[x].k <= k)
        ans ++;
    }
    for(int i = s[y].l; i <= r; i ++){
        if(a[i] + s[y].k <= k)
        ans ++;
    }
    return ans;
}
signed main(){
    for(int i = 1; i <= n; i ++){
        b[i] = a[i] = mread();
    }
    q = sqrt(n);
    for(int i = 1; i <= q; i ++){
        s[i].l = s[i - 1].r + 1;
        s[i].r = s[i].l + q - 1;
    }
    s[q].r = n;
    for(int i = 1; i <= q; i ++){
        sort(b + s[i].l, b + s[i].r + 1);
        for(int j = s[i].l; j <= s[i].r; j ++){
            belong[j] = i;
        }
    }
    int m = mread();
    for(int i = 1; i <= m; i ++){
        int op = mread();
        int l = mread(), r = mread(), v = mread();
        if(op == 1)
        add(l, r, v);
        else
        fout << query(l, r, v) << "\n";
        // for(int i = 1; i <= n; i ++)
        // printf("%lld ", b[i]);
        // printf("\n");
    }
    return 0;
}