WA50pts,求改成TLE70pts
查看原帖
WA50pts,求改成TLE70pts
1070708
Caged_Bird楼主2024/10/21 16:29
#include<bits/stdc++.h>
#define int long long
#define ls now*2
#define rs now*2+1
using namespace std;
struct node{
	int s,t,val,tag;
}tree[800005];
int a[200005],n,q,w;
void build(int l,int r,int now){
	tree[now].s=l;
	tree[now].t=r;
	tree[now].tag=0;
	if(l==r){
		tree[now].val=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,ls);
	build(mid+1,r,rs);
	tree[now].val=tree[ls].val+tree[rs].val;
}
void push_down(int now){
	tree[ls].tag+=tree[now].tag;
	tree[rs].tag+=tree[now].tag;
	tree[ls].val+=tree[now].tag*(tree[ls].t-tree[ls].s+1);
	tree[rs].val+=tree[now].tag*(tree[rs].t-tree[rs].s+1);
	tree[now].tag=0;
}
int query(int l,int r,int now){
	if(r<l)return 0;
	if(tree[now].s>=l&&tree[now].t<=r){
		return tree[now].val;
	}
	if(tree[now].s>r||tree[now].t<l)return 0;
	if(tree[now].tag!=0)push_down(now);
	return query(l,r,ls)+query(l,r,rs);
}
void modify(int l,int r,int now,int k){
	if(tree[now].s>=l&&tree[now].t<=r){
		tree[now].tag+=k;
		tree[now].val+=k*(tree[now].t-tree[now].s+1);
		return;
	}
	if(tree[now].s>r||tree[now].t<l)return;
	if(tree[now].tag!=0)push_down(now);
	modify(l,r,ls,k);modify(l,r,rs,k);
	tree[now].val=tree[ls].val+tree[rs].val;
}

inline int read(){
    int f=1,x=0;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while('0'<=ch&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
inline void print(int x){
    if(x<0){
        putchar('-');
        print(-x);
        return;
    }
    if(x>9){
        print(x/10);
    }
    putchar(x%10+'0');
}
signed main(){
//	freopen("wxyt3.in","r",stdin);
//	freopen("wxyt3.out","w",stdout);
//	ios::sync_with_stdio(0);
//	cin.tie(0);
//	cout.tie(0);
	n=read();
	q=read();
	w=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	build(1,n,1);
	while(q--){
		int l,r,d;
		l=read();
		r=read();
		d=read(); 
		modify(l,r,1,d);
		int sum=query(1,n,1),p=2,tgt,t;
		for(int i=1;i<=10000000000;i++){
			if((p-1)*sum>=w){
				t=i-1;
				tgt=w-(p/2-1)*sum;
				break;
			}
			p*=2;
		}
		int left=0,right=n;
		while(right-left>1){
			int mid=(left+right)/2;
			if(query(1,mid,1)*(1<<t)<tgt){
				left=mid;
			}
			else right=mid;
		}
		print(t*n+left);
		putchar('\n'); 
	}
	return 0;
}
2024/10/21 16:29
加载中...