大样例也过了,时间复杂度也没问题,WA+TLE 50pts?
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> PII;
template<typename T>
T read(T x)
{
T opt = 1, sum = 0;
char ch = getchar();
while(!isdigit(ch)) opt = (ch == '-') ? -1 : 1, ch = getchar();
while( isdigit(ch)) sum = (sum << 1) + (sum << 3) + (ch ^ 48), ch = getchar();
return opt * sum;
}
#define read read(0ll)
int n, q, w;
const int N = 2e5 + 5;
int a[N], sum;
int quick_pow(int a, int b)
{
int ans = 1, base = a;
while(b > 0){
if(b & 1){
ans *= base;
}
base *= base;
b >>= 1;
}
return ans;
}
PII find(int x){
int l = 0, r = max((int)1, (int)log2(w / x)), ans;
while(l <= r){
int mid = (l + r) / 2;
if((quick_pow(2, mid) - 1) * x < w){
// cout << quick_pow(2, mid) * x << endl;
ans = mid;
l = mid + 1;
}
else r = mid - 1;
}
return {ans, w - ((quick_pow(2, ans) - 1) * x)};
}
struct Segment
{
struct node
{
int l, r, sum, lazy;
}tr[N << 2];
void build(int u, int l, int r){
tr[u].l = l, tr[u].r = r;
if(l == r) {
tr[u].sum = a[l];
return ;
}
int mid = (l + r) / 2;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}
void update(int u, int l, int r, int k){
if(l <= tr[u].l && tr[u].r <= r){
tr[u].lazy += k;
return ;
}
tr[u].sum += (min(tr[u].r, r) - max(tr[u].l, l) + 1) * k;
int mid = (tr[u].l + tr[u].r) / 2;
if(l <= mid) update(u << 1, l, r, k);
if(r > mid) update(u << 1 | 1, l, r, k);
}
int query(int u, int l, int r){
if(l <= tr[u].l && tr[u].r <= r){
return tr[u].sum + (tr[u].r - tr[u].l + 1) * tr[u].lazy;
}
int res = (min(tr[u].r, r) - max(tr[u].l, l) + 1) * tr[u].lazy;
int mid = (tr[u].l + tr[u].r) / 2;
if(l <= mid) res += query(u << 1, l, r);
if(r > mid) res += query(u << 1 | 1, l, r);
return res;
}
}seg;
int find2(int x, int lun){
int l = 1, r = n - 1, ans = 0;
while(l <= r){
int mid = (l + r) / 2;
if(seg.query(1, 1, mid) * (quick_pow(2, lun)) < x){
ans = mid;
l = mid + 1;
}
else r = mid - 1;
}
return ans;
}
signed main()
{
// freopen("wxyt2.in","r", stdin);
// freopen("my.out","w",stdout);
n = read, q = read, w = read;
for(int i = 1;i <= n;i ++ ){
a[i] = read; sum += a[i];
}
seg.build(1, 1, n);
for(int i = 1;i <= q;i ++ ){
int l = read, r = read, d = read;
sum += (r - l + 1) * d;
PII k = find(sum);
int lun = k.first, num = k.second;
seg.update(1, l, r, d);
int res = find2(num, lun);
// cout << res << endl;
cout << lun * n + res << endl;
// cout << "==============\n";
}
return 0;
}