记录编号 312347 评测结果 WWWWWWWWWW
题目名称 [EZOI 2016]源氏的数学课 最终得分 0
用户昵称 GravatarAntiLeaf 是否通过 未通过
代码语言 C++ 运行时间 1.959 s
提交时间 2016-09-26 10:01:47 内存使用 5.11 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int maxn=100010;
struct oper{
	int x,id;
	LL y;//if query,then y means *= 1 or -1
	bool d;//0:modify 1:query
	bool operator<(const oper &a)const{return x<a.x;}
}a[maxn<<1];
void CDQ(int,int);
int n,m,d;
LL b[maxn],c[maxn],ans[maxn]={0},tmpb,tmpc;
int main(){
#define MINE
#ifdef MINE
	freopen("overwatch.in","r",stdin);
	freopen("overwatch.out","w",stdout);
#endif
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&b[i]);
		c[i]=b[i]*(LL)(n-i+1);
	}
	for(int i=1;i<=n;i++){
		b[i]+=b[i-1];
		c[i]+=c[i-1];
	}
	m<<=1;
	for(int i=1;i<m;i+=2){
		scanf("%d",&d);
		a[i].id=a[i+1].id=i;
		if(d==1){
			scanf("%d%lld",&a[i].x,&a[i].y);
			a[i].d=a[i+1].d=false;
			a[i+1].x=a[i].x;
			a[i+1].y=0ll;
		}
		else{
			scanf("%d%d",&a[i].x,&a[i+1].x);
			a[i].x--;
			ans[i]+=c[a[i+1].x]-c[a[i].x]-(b[a[i+1].x]-b[a[i].x])*(LL)(n-a[i+1].x);
			a[i].y=-1;
			a[i+1].y=1;
			a[i].d=a[i+1].d=true;
		}
	}
	
	CDQ(1,m);
	for(int i=1;i<=m;i++)if(ans[i])printf("%lld\n",ans[i]);
#ifndef MINE
	printf("\n--------------------DONE--------------------\n");
	for(;;);
#endif
	return 0;
}
void CDQ(int l,int r){
	if(l>=r)return;
	int mid=(l+r)>>1;
	CDQ(l,mid);
	tmpb=tmpc=0;
	sort(a+l,a+r+1);
	for(int i=l;i<=r;i++){
		if(a[i].d){
			if(a[i].id>mid)ans[a[i].id]+=a[i].y*(tmpc-tmpb*(LL)(n-a[i].x));
		}
		else if(a[i].id<=mid){
			tmpb+=a[i].y;
			tmpc+=a[i].y*(LL)(n-a[i].x+1);
		}
	}
	CDQ(mid+1,r);
}