比赛 |
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;
}