213123

31232133333333333333

#include<bits/stdc++.h> using namespace std; const int maxn = 1e6 + 100; bool flag = 0; long long n,q,te; long long block, be[maxn], l[maxn], ad1[maxn],a[maxn],b[maxn]; void blad(int l1, int r1, int val) { for (int i = l1; i <= r1; i++) { a[i] += val; } for (int i = l[be[l1]]; i <= l[be[l1] + 1] - 1; i++) { b[i] = a[i]; } if (be[l1] != block + 1)sort(b + l[be[l1]], b + l[be[l1]] + block); else sort(b + l[be[l1]], b + l[be[l1]] + te); } void ad(int l1, int r1, int val) { if (be[l1] == be[r1]) { blad(l1, r1, val); return; } blad(l1, l[be[l1] + 1] - 1, val); blad(l[be[r1]], r1, val); for (int j = be[l1] + 1; j < be[r1]; j++) { ad1[j] += val; } return; } int qz(int l, int r, int val) { int ans = 0; if (ad1[be[l]] >= val)return (r - l + 1); ans = lower_bound(b + l, b + r + 1, val-ad1[be[l]]) - b; //cout << l << r << ans<<endl; if (b[ans] >= val - ad1[be[l]]) { //cout << ans<<" "<<213123<<endl; return r - ans + 1; } else { //cout << 222; return 0; } } int blqz(int l1, int r1, int val) { int ans = 0; for (int i = l1; i <= r1; i++) { if (a[i] +ad1[be[i]] >= val)ans++; } return ans; } int query(int l1, int r1, int val) { int ans = 0; if (be[l1] == be[r1]) { for (int i = l1; i <= r1; i++) { if (a[i] + ad1[be[i]] >= val)ans++; } return ans; //cout << l1 << "到" << r1 << "有" << ans << endl; } ans += blqz(l1, l[be[l1] + 1] - 1, val); //cout << l1 << "到" << l[be[l1] + 1] - 1 << "有" << ans << endl; ans += blqz(l[be[r1]], r1, val); //cout << l[be[r1]] << "到" << r1 << "有" << ans << endl; for (int i = be[l1] + 1; i < be[r1]; i++) { //cout << l[i] << " " << l[i] + block - 1 << endl; //if (qz(l[i], l[i] + block - 1, val) < 0)cout << "出错了" << endl; if (i != block + 1)ans += qz(l[i], l[i] + block - 1,val); else ans += qz(l[i], l[i] + te - 1, val); } //cout << l[be[l1] + 1] << "到" << l[be[r1]]-1 << "有" << ans << endl; return ans; } int main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin >> n >> q; block = sqrt(n); if (block * block != n)flag = 1; for (int i = 1; i <= n; i++) { cin >> a[i]; b[i] = a[i]; be[i] = (i - 1) / block + 1; if (be[i] != be[i - 1])l[be[i]] = i; //cout << l[2] << endl; } for (int i = 1; i <= block; i++) { sort(b + l[i], b + l[i] + block); //cout << l[be[i]] << endl; } te = n - block * block; if (te>0)sort(b + l[block+1], b + l[block + 1] + te); l[be[n] + 1] = n + 1; //int x1 = lower_bound(b + 1, b + 1 + n, 5)-b; //cout << x1 << endl; //for (int i = 1; i <= n; i++)cout << b[i] << " "; char c; int x, y, z; for (int i = 1; i <= q; i++) { cin >> c >> x >> y >> z; if (c == 'A') { cout << query(x, y, z)<<endl; } else { ad(x, y, z); } } return 0; }有什么错误吗
07-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值