re 本地运行样例全过 求调谢谢
查看原帖
re 本地运行样例全过 求调谢谢
1111313
ZCfree楼主2024/10/22 15:05
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6;
int a[4*N], tr[4*N], lazy[4*N];
int n, q, w;
int wi;
inline void push_up(int id) 
{
    tr[id] = tr[id << 1] + tr[id << 1 | 1];
    return;
}

inline void push_down(int id, int l, int r) 
{
    if (lazy[id]) 
	{
        int mid = (l + r) >> 1;
        lazy[id << 1] += lazy[id];
        lazy[id << 1 | 1] += lazy[id];
        tr[id << 1] += lazy[id] * (mid - l + 1);
        tr[id << 1 | 1] += lazy[id] * (r - mid);
        lazy[id] = 0;
    }
}

inline void build(int id, int l, int r) 
{
    if (l == r) 
	{
        tr[id] = a[l];
        return;
    }
    int mid = (l + r) >> 1;
    build(id << 1, l, mid);
    build(id << 1 | 1, mid + 1, r);
    push_up(id);
}

inline void update(int id, int l, int r, int x, int y, int v) {
    if (x <= l && r <= y) 
	{
        lazy[id] += v;
        tr[id] += v * (r - l + 1);
        return;
    }
    int mid = (l + r) >> 1;
    push_down(id, l, r);
    int all = 0;
    if (x <= mid) 
	{
        update(id << 1, l, mid, x, y, v);
    }
    if (y > mid) 
	{
        update(id << 1 | 1, mid + 1, r, x, y, v);
    }
    push_up(id);
    return;
}

inline int find(int id, int l, int r,int i) 
{
    if (l==r) 
	{
		//cout<<l<<endl;
        return l-1;
    }
    int mid = (l + r) >> 1;
    push_down(id, l, r);
    if (wi <= tr[id<<1]*pow(2,i)) 
	{
        find(id << 1, l, mid, i);
    }
    else
	{
		wi-=tr[id<<1]*pow(2,i);
        find(id << 1 | 1, mid + 1, r, i);
    }
}

inline void ans(void) 
{
    wi = w;
    int i=0;
    //cout<<tr[1]<<"he"<<endl;
    while(wi>0)
    {
    	wi-=tr[1]*pow(2,i);
    	if(wi<=0)
    	{
    		wi+=tr[1]*pow(2,i);
    		break;
		}
		i++;
	}
	//cout<<wi<<endl; 
	cout<<find(1,1,n,i)+i*n<<endl;
}

signed main() 
{
	//freopen("wxyt2.in","r",stdin);
	//freopen("wxyt2.out","w",stdout);
    cin >> n >> q >> w;
    for (int i = 1; i <= n; i++) 
	{
        cin >> a[i];
    }
    build(1, 1, n);
    for (int i = 1; i <= q; i++) 
	{
        int l, r, d;
        cin >> l >> r >> d;
        update(1, 1, n, l, r, d);
        ans();
    }
}
2024/10/22 15:05
加载中...