记录编号 418198 评测结果 AAAAAAAAAA
题目名称 [HZOI 2015]简单的求和问题 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 1.613 s
提交时间 2017-06-29 16:38:05 内存使用 42.26 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+10,SIZE=500,CNT=210;
int n,m,pre[N],a[N],blo[N],l[N],r[N];
int tag[CNT],L[CNT],R[CNT],cnt;
ll sum[CNT];
unsigned short k[CNT][N];
int getpre(int x){
	if (!x) return 0;
	return pre[x]+tag[blo[x]];
}
void add(int p,int d){
	int v=d;
	d=v-a[p];a[p]=v;
	for (int i=p;i<=R[blo[p]];i++) pre[i]+=d;
	for (int i=blo[p]+1;i<=cnt;i++) tag[i]+=d;
	for (int i=0;i<=cnt;i++) sum[i]+=d*k[i][p];
}
ll query(int x,int LL,int RR){
	LL=max(LL,L[x]);
	RR=min(RR,R[x]);
	if (LL==L[x]&&RR==R[x]) return sum[x]; 
	ll ans=0;
	for (int i=LL;i<=RR;i++) ans+=getpre(r[i])-getpre(l[i]-1);
	return ans;
}
ll query(int l,int r){
	ll ans=0;
	for (int i=blo[l];i<=blo[r];i++) ans+=query(i,l,r);
	return ans;
}
int main()
{
	freopen("get_sum.in","r",stdin);
	freopen("get_sum.out","w",stdout);
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		pre[i]=a[i]+pre[i-1];
		blo[i]=i/SIZE;
	}
	for (int i=1;i<=n;i++){
		scanf("%d%d",&l[i],&r[i]);
		k[blo[i]][r[i]+1]--;
		k[blo[i]][l[i]]++;
		sum[blo[i]]+=pre[r[i]]-pre[l[i]-1];
	}
	cnt=n/SIZE;
	for (int i=0;i<=cnt;i++){
		L[i]=max(i*SIZE,1);
		R[i]=min((i+1)*SIZE-1,n);
		for (int j=1;j<=n;j++) k[i][j]+=k[i][j-1];
	}
	char s[5];int l,r;
	while (m--){
		scanf("%s%d%d",s,&l,&r);
		if (s[0]=='M') add(l,r);
			else printf("%lld\n",query(l,r));
	}
	return 0;
}