比赛 |
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;
}