比赛 cdcqの省选膜你赛 评测结果 WWWWWWAAWWWWWWAAWWWW
题目名称 新史「新幻想史 -现代史-」 最终得分 20
用户昵称 wyj 运行时间 1.355 s
代码语言 C++ 内存使用 13.77 MiB
提交时间 2017-04-11 12:00:01
显示代码纯文本
/*
  t1
  2017.04.11
    ---wyj
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,w[220500],st,ed,ttb,ttw;long long ans[220500],len=0;//ttb:增加量,ttw:减少量
struct node
{
  int op,x,y,z,l,r,v,t,id;
}tta[220500];
struct hehe
{
   long long sum,delta;
}a[220500];
bool mycmp(node a,node b)
{
  return a.t<b.t||(a.t==b.t&&a.op<b.op);
}
void build(int left,int right,int root)
{
  a[root].delta=0;
  if(left==right) {a[root].sum=w[left];return;}
  int mid=(left+right)/2;
  build(left,mid,root*2);build(mid+1,right,root*2+1);
  a[root].sum=a[root*2].sum+a[root*2+1].sum;
}
int find(int left,int right,int root)//查询操作
{
  if(left>ed||right<st)  return 0;
  if(st<=left&&ed>=right) return a[root].sum+a[root].delta*(right-left+1);
  int mid=(left+right)/2;a[root*2].delta+=a[root].delta;a[root*2+1].delta+=a[root].delta;
  int fx=find(left,mid,root*2),fy=find(mid+1,right,root*2+1);
  return fx+fy;
}
void change(int left,int right,int root)//区间加法
{
  if(left>ed||right<st) return;
  if(st<=left&&ed>=right)
  {
	a[root].delta+=ttb;
	return;
  }int mid=(left+right)/2;
  change(left,mid,root*2);change(mid+1,right,root*2+1);
  a[root].sum=a[root*2].sum+a[root*2+1].sum+a[root*2].delta*(mid-left+1)+a[root*2+1].delta*(right-mid);
}
void change2(int left,int right,int root)//区间减法
{
   if(left>ed||right<st) return;
  if(st<=left&&ed>=right)
  {
    a[root].delta-=ttw;
	return;
  }int mid=(left+right)/2;
  change2(left,mid,root*2);change2(mid+1,right,root*2+1);
  a[root].sum=a[root*2].sum+a[root*2+1].sum+a[root*2].delta*(mid-left+1)+a[root*2+1].delta*(right-mid);
}
void init()
{
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n;i++)
	scanf("%d",&w[i]);build(1,n,1);
  for(int i=1;i<=m;i++)
  {
	char ch;cin>>ch;
	if(ch=='M')
	{
	  scanf("%d%d%d%d%d%d%d",&tta[i].x,&tta[i].y,&tta[i].z,&tta[i].l,&tta[i].r,&tta[i].v,&tta[i].t);
	  tta[i].op=1;
	}
	else
	{
	  scanf("%d%d%d",&tta[i].x,&tta[i].y,&tta[i].t);
	  tta[i].op=2;tta[i].id=++len;
	}
  }
  sort(tta+1,tta+m+1,mycmp);
}
void work()
{
  for(int i=1;i<=m;i++)
  {
    if(tta[i].op==2)//查询
	{
	  st=tta[i].x,ed=tta[i].y;
	  ans[tta[i].id]=find(1,n,1);
	}
	else
	{
	  st=tta[i].x,ed=tta[i].y;
	  ttw=tta[i].z;change2(1,n,1);
	  st=tta[i].l;ed=tta[i].r;
	  ttb=tta[i].v;change(1,n,1);
	}
  }
  for(int i=1;i<=len;i++)
	cout<<ans[i]<<endl;
}
int main()
{
  freopen("cdcq_a.in","r",stdin);
  freopen("cdcq_a.out","w",stdout);
  init();
  work();
  return 0;
}