比赛 |
cdcqの省选膜你赛 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
新史「新幻想史 -现代史-」 |
最终得分 |
100 |
用户昵称 |
FoolMike |
运行时间 |
5.935 s |
代码语言 |
C++ |
内存使用 |
61.32 MiB |
提交时间 |
2017-04-11 18:33:58 |
显示代码纯文本
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e6+10;
ll sum[N],tag[N];
#define lc x<<1
#define rc x<<1|1
void modify(int x,int l,int r,ll d){
tag[x]+=d;
sum[x]+=d*(r-l+1);
}
void pushdown(int x,int l,int r){
if (l!=r&&tag[x]){
int mid=(l+r)>>1;
modify(lc,l,mid,tag[x]);
modify(rc,mid+1,r,tag[x]);
tag[x]=0;
}
}
void add(int x,int l,int r,int L,int R,int d){
if (l>=L&&r<=R) return modify(x,l,r,d);
pushdown(x,l,r);
int mid=(l+r)>>1;
if (L<=mid) add(lc,l,mid,L,R,d);
if (R>mid) add(rc,mid+1,r,L,R,d);
sum[x]=sum[lc]+sum[rc];
}
ll query(int x,int l,int r,int L,int R){
if (l>=L&&r<=R) return sum[x];
pushdown(x,l,r);
int mid=(l+r)>>1;ll ans=0;
if (L<=mid) ans+=query(lc,l,mid,L,R);
if (R>mid) ans+=query(rc,mid+1,r,L,R);
return ans;
}
struct opt{int tp,T,l,r,d;}Q[N],q[N];
//tp=0表示修改,tp=id表示询问
bool cmp(const opt &x,const opt &y){
return x.T==y.T?x.tp<y.tp:x.T<y.T;
}
int n,m,cnt;ll ans[N];
void solve(int l,int r){
if (l==r) return;
int mid=(l+r)>>1;
solve(l,mid);
solve(mid+1,r);
int m=0;
for (int i=l;i<=mid;i++)
if (!Q[i].tp) q[++m]=Q[i];
for (int i=mid+1;i<=r;i++)
if (Q[i].tp) q[++m]=Q[i];
sort(q+1,q+m+1,cmp);
for (int i=1;i<=m;i++){
if (q[i].tp) ans[q[i].tp]+=query(1,1,n,q[i].l,q[i].r);
else add(1,1,n,q[i].l,q[i].r,q[i].d);
}
for (int i=1;i<=m;i++)
if (!q[i].tp) add(1,1,n,q[i].l,q[i].r,-q[i].d);
}
int main()
{
freopen("cdcq_a.in","r",stdin);
freopen("cdcq_a.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++){
int x;scanf("%d",&x);
Q[++cnt]=(opt){0,0,i,i,x};
}
char s[10]="";
for (int i=1;i<=m;i++){
int l,r,d,L,R,D,t;
scanf("%s%d%d",s,&l,&r);
if (s[0]=='Q'){
scanf("%d",&t);
Q[++cnt]=(opt){i,t,l,r,0};
}
else{
scanf("%d%d%d%d%d",&d,&L,&R,&D,&t);
Q[++cnt]=(opt){0,t,l,r,-d};
Q[++cnt]=(opt){0,t,L,R,D};
}
}
solve(1,cnt);
for (int i=1;i<=cnt;i++)
if (Q[i].tp) printf("%lld\n",ans[Q[i].tp]);
return 0;
}