有谁告诉我为啥RE
  • 板块P4868 Preprefix sum
  • 楼主y0y68
  • 当前回复1
  • 已保存回复1
  • 发布时间2020/8/27 21:04
  • 上次更新2023/11/5 14:10:59
查看原帖
有谁告诉我为啥RE
115668
y0y68楼主2020/8/27 21:04
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int N=2e5+5;
int n,m,a[N],f[N];
struct Segment_tree{
	struct Node{
		int s,tag;
	}tree[N<<2];
	int ls(int u){return u<<1;}
	int rs(int u){return u<<1|1;}
	void push_up(int u){tree[u].s=tree[ls(u)].s+tree[rs(u)].s;}
	void push_down(int u,int l,int r){
		if(tree[u].tag){
			tree[ls(u)].tag+=tree[u].tag;
			tree[rs(u)].tag+=tree[u].tag;
			tree[ls(u)].s+=l*tree[u].tag;
			tree[rs(u)].s+=r*tree[u].tag;
			tree[u].tag=0;
		}
	}
	void update(int u,int l,int r,int L,int R,int x){
		if(l>=L&&R>=r){
			tree[u].tag+=x;
			tree[u].s+=(r-l+1)*x;
			return;
		}
		int mid=l+r>>1;
		push_down(u,mid-l+1,r-mid);
		if(mid>=L)update(ls(u),l,mid,L,R,x);
		if(R<mid)update(rs(u),mid+1,r,L,R,x);
		push_up(u);
	}
	int query(int u,int l,int r,int L,int R){
		if(l>=L&&R>=r)return tree[u].s;
		int res=0;int mid=l+r>>1;
		push_down(u,mid-l+1,r-mid);
		if(mid>=L)res+=query(ls(u),l,mid,L,R);
		if(R<mid)res+=query(rs(u),mid+1,r,L,R);
		return res;
	}
}t;
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	for(int i=1;i<=n;i++)
		f[i]=f[i-1]+a[i];
	for(int i=2;i<=n;i++)
		f[i]+=f[i-1];
	while(m--){
		char opt[10];
		scanf("%s",opt);
		if(opt[0]=='Q'){
			int k;
			scanf("%d",&k);
			printf("%lld\n",f[k]+t.query(1,1,n,1,k));
		}
		else{
			int k,x;
			scanf("%d%d",&k,&x);
			t.update(1,1,n,k,n,x-a[k]);
			a[k]=x;
		}
	}
	return 0;
}
2020/8/27 21:04
加载中...