比赛 |
cdcqの省选膜你赛 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
新史「新幻想史 -现代史-」 |
最终得分 |
100 |
用户昵称 |
will |
运行时间 |
1.400 s |
代码语言 |
C++ |
内存使用 |
28.52 MiB |
提交时间 |
2017-04-11 10:41:54 |
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <algorithm>
#define TR(x) cout<<#x<<'='<<x<<endl
using namespace std;
typedef long long ll;
const int MAXN=200005, MAXB=2e7, INF=0x3f3f3f3f;
char BUF[MAXB], *cp=BUF;
void rd(int &x){
x=0;
while(*cp<'0'||'9'<*cp) cp++;
while('0'<=*cp&&*cp<='9') x=x*10+*cp-'0', cp++;
}
char rdc(){
while(*cp<'A'||'Z'<*cp) cp++;
return *cp;
}
int N, M, T, K;
int vis[MAXN];
ll ans[MAXN];
struct BIT{
ll s[MAXN], t[MAXN];
inline void _add(int x, int k){
ll m=k*x;
for(int i=x; i<=N; i+=i&-i) s[i]+=k;
for(int i=x; i<=N; i+=i&-i) t[i]+=m;
}
void add(int l, int r, int k){
_add(l,k); _add(r+1,-k);
}
inline ll _sum(int x){
ll r=0;
for(int i=x; i; i-=i&-i) r+=s[i];
r=r*(x+1);
for(int i=x; i; i-=i&-i) r-=t[i];
return r;
}
ll sum(int l, int r){
return _sum(r)-_sum(l-1);
}
void clr(){
memset(s,0,sizeof(s));
memset(t,0,sizeof(t));
}
}B;
struct Qry{
int l,r,v,t,id;
Qry(){}
Qry(int l,int r,int v,int t,int id):l(l),r(r),v(v),t(t),id(id){}
int operator<(const Qry &o)const{
if(t==o.t) return id<o.id;
return t<o.t;
}
}Q[MAXN];
void cdq(int l, int r){
// TR(l),TR(r);
if(l==r) return;
int mid=(l+r)>>1;
cdq(l,mid);
cdq(mid+1,r);
sort(Q+l,Q+r+1);
for(int i=l; i<=r; ++i){
// printf("%d: l=%d, r=%d, v=%d, id=%d\n", i,Q[i].l,Q[i].r,Q[i].v,Q[i].id);
if(Q[i].id<=mid&&!vis[Q[i].id]){
B.add(Q[i].l,Q[i].r,Q[i].v);
}else if(Q[i].id>mid&&vis[Q[i].id]){
ans[Q[i].id]+=B.sum(Q[i].l,Q[i].r);
}
}
for(int i=l; i<=r; ++i){
if(Q[i].id<=mid&&!vis[Q[i].id]){
B.add(Q[i].l,Q[i].r,-Q[i].v);
}
}
// for(int i=1; i<=T; ++i) TR(ans[i]);
}
int main(){
FILE *_file=fopen("cdcq_a.in", "r");
BUF[fread(BUF, 1, MAXB, _file)]=0;
freopen("cdcq_a.out", "w", stdout);
rd(N),rd(M);
for(int i=1,a; i<=N; ++i) rd(a),B.add(i,i,a);
for(int i=1,x,y,z,l,r,v,t; i<=M; ++i){
if(rdc()=='Q'){
rd(x),rd(y),rd(z);
++T,Q[T]=Qry(x,y,0,z,T);
vis[T]=1; ans[T]=B.sum(x,y);
}else{
rd(x),rd(y),rd(z),rd(l),rd(r),rd(v),rd(t);
++T,Q[T]=Qry(x,y,-z,t,T);
++T,Q[T]=Qry(l,r,v,t,T);
}
}
B.clr();
cdq(1,T);
for(int i=1; i<=T; ++i){
if(vis[i]) printf("%lld\n", ans[i]);
}
return 0;
}