记录编号 |
264714 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HZOI 2015]简单的求和问题 |
最终得分 |
100 |
用户昵称 |
Aglove |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.970 s |
提交时间 |
2016-05-30 14:08:27 |
内存使用 |
12.14 MiB |
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int maxn=100010;
int n,m,cnt,mblo,km;
int nblo,kn;
int a[maxn],b[maxn];
int pos[maxn];
int Num[maxn],add[maxn];
LL Sa[maxn],Sf[maxn];
struct OP{
int L,R;
}c[maxn];
struct ASK{
char type;
int u,v,id;
}Q[maxn<<1],Q1[maxn<<1];
LL ans[maxn<<1];
bool cmpu(const ASK &A,const ASK &B){return A.u<B.u;}
void read(int &num){
num=0;char ch=getchar();
while(ch<'!')ch=getchar();
while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();
}
void UPD(int u,int v){
int L=pos[u],R=pos[v],tmp;
if(L==R){
for(int i=u;i<=v;++i)Num[i]++;
}else{
tmp=L*nblo;
for(int i=u;i<=tmp;++i)Num[i]++;
tmp=(R-1)*nblo+1;
for(int i=tmp;i<=v;++i)Num[i]++;
for(int i=L+1;i<R;++i)add[i]++;
}return;
}
int ask(int u){return Num[u]+add[pos[u]];}
int main(){
freopen("get_sum.in","r",stdin);
freopen("get_sum.out","w",stdout);
read(n);read(m);nblo=(int)(sqrt(n));
for(int i=1;i<=n;++i)read(a[i]),b[i]=a[i],pos[i]=(i-1)/nblo+1;
for(int i=1;i<=n;++i)read(c[i].L),read(c[i].R);
for(int i=1;i<=m;++i){
cnt++;Q[cnt].type=getchar();
while(Q[cnt].type<'!')Q[cnt].type=getchar();
Q[cnt].id=cnt;
if(Q[cnt].type=='Q'){
read(Q[cnt].u);Q[cnt].u--;
cnt++;Q[cnt].type='Q';Q[cnt].id=cnt;
read(Q[cnt].u);
}else{
read(Q[cnt].u);read(Q[cnt].v);
Q[cnt].v=Q[cnt].v-b[Q[cnt].u];
b[Q[cnt].u]+=Q[cnt].v;
}
}mblo=(int)(sqrt(cnt));
km=(cnt%mblo==0?cnt/mblo:cnt/mblo+1);
for(int i=1;i<=cnt;++i)Q1[i]=Q[i];
sort(Q1+1,Q1+cnt+1,cmpu);
int now=1;
for(int i=1;i<=cnt;++i){
if(Q1[i].type=='M')continue;
while(now<=n&&now<=Q1[i].u){
UPD(c[now].L,c[now].R);
now++;
}
int cur=Q1[i].id;
int pi=(cur-1)/mblo+1;
int L=(pi-1)*mblo+1;
for(int j=L;j<=cnt;++j){
if(Q[j].id>cur)break;
if(Q[j].type=='Q')continue;
ans[cur]=ans[cur]+1LL*Q[j].v*ask(Q[j].u);
}
}
for(int i=1;i<=n;++i)Sa[i]=Sa[i-1]+a[i];
for(int i=1;i<=n;++i)Sf[i]=Sf[i-1]+Sa[c[i].R]-Sa[c[i].L-1];
for(int i=1;i<=km;++i){
int L=(i-1)*mblo+1,R=min(cnt,i*mblo);
for(int j=L;j<=R;++j){
if(Q[j].type=='M'){
a[Q[j].u]+=Q[j].v;
}else ans[Q[j].id]=ans[Q[j].id]+Sf[Q[j].u];
}
for(int j=1;j<=n;++j)Sa[j]=Sa[j-1]+a[j];
for(int j=1;j<=n;++j)Sf[j]=Sf[j-1]+Sa[c[j].R]-Sa[c[j].L-1];
}
for(int i=1;i<=cnt;++i){
if(Q[i].type=='Q'){
printf("%lld\n",ans[i+1]-ans[i]);
i++;
}
}return 0;
}