比赛 |
cdcqの省选膜你赛 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
新史「新幻想史 -现代史-」 |
最终得分 |
100 |
用户昵称 |
fjzzq2002 |
运行时间 |
1.118 s |
代码语言 |
C++ |
内存使用 |
8.35 MiB |
提交时间 |
2017-04-11 22:04:13 |
显示代码纯文本
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <math.h>
#include <limits>
#include <set>
#include <map>
using namespace std;
#define SZ 123456
typedef long long ll;
int n,m,Q=0,q=0; ll ans[SZ];
struct cq {int tp,t,qx,qy,id,wx,wy,v1,v2;}qs[SZ];
bool operator < (cq a,cq b) {return a.t<b.t;}
ll a1[SZ],a2[SZ];
ll qzh(int r)
{
ll s1=0,s2=0;
for(int i=r;i>=1;i-=i&-i) s1+=a1[i], s2+=a2[i];
return (r+1)*s1-s2;
}
ll sum(int l,int r)
{
return qzh(r)-qzh(l-1);
}
void edt(ll a,ll s1)
{
ll s2=a*s1;
for(;a<=n;a+=a&-a) a1[a]+=s1, a2[a]+=s2;
}
void edt(int l,int r,ll a) {edt(l,a); edt(r+1,-a);}
void cdq(int l,int r)
{
if(l>=r) return;
int mid=(l+r)>>1;
cdq(l,mid); cdq(mid+1,r);
sort(qs+l,qs+mid+1);
sort(qs+mid+1,qs+r+1);
int cur=l;
for(int i=mid+1;i<=r;i++)
{
if(qs[i].tp!=1) continue;
int t=qs[i].t;
while(cur<=mid&&qs[cur].t<=t)
{
if(qs[cur].tp==0)
{
edt(qs[cur].qx,qs[cur].qy,-qs[cur].v1);
edt(qs[cur].wx,qs[cur].wy,qs[cur].v2);
}
++cur;
}
ans[qs[i].id]+=sum(qs[i].qx,qs[i].qy);
}
for(int i=l;i<cur;i++) if(qs[i].tp==0)
{
edt(qs[i].qx,qs[i].qy,qs[i].v1);
edt(qs[i].wx,qs[i].wy,-qs[i].v2);
}
}
ll b2[SZ];
void edt2(int x,int y)
{
for(;x<=n;x+=x&-x) b2[x]+=y;
}
ll sum2(int x)
{
ll ans=0;
for(;x>=1;x-=x&-x) ans+=b2[x];
return ans;
}
char ch,B[1<<15],*S=B,*T=B;
#define getc() (S==T&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?0:*S++)
#define isd(c) (c>='0'&&c<='9')
int aa,bb;int F(){
while(ch=getc(),!isd(ch)&&ch!='-');ch=='-'?aa=bb=0:(aa=ch-'0',bb=1);
while(ch=getc(),isd(ch))aa=aa*10+ch-'0';return bb?aa:-aa;
}
#define gi F()
int main()
{
freopen("cdcq_a.in","r",stdin);
freopen("cdcq_a.out","w",stdout);
n=gi,m=gi;
for(int i=1;i<=n;i++) edt2(i,gi);
for(int i=1;i<=m;i++)
{
char s=0;
while(s!='Q'&&s!='M') s=getc();
if(s=='Q')
{
int x=gi,y=gi,t=gi;
++Q; ++q; qs[Q].id=q; qs[Q].tp=1;
qs[Q].qx=x; qs[Q].qy=y; qs[Q].t=t;
ans[q]=sum2(y)-sum2(x-1);
}
else
{
int x=gi,y=gi,z=gi,l=gi,r=gi,v=gi,t=gi;
++Q; qs[Q].tp=0; qs[Q].qx=x; qs[Q].qy=y; qs[Q].v1=z;
qs[Q].wx=l; qs[Q].wy=r; qs[Q].v2=v; qs[Q].t=t;
}
}
cdq(1,Q);
for(int i=1;i<=q;i++) printf("%lld\n",ans[i]);
}