| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
AC代码#include<cstdio>
#include<iostream>
#define N 100000
#define ll long long
using namespace std;
char ord;
int n,q;
ll A[N+10];
struct node
{
int l,r;
ll sum;
ll val;
}date[6*N];
void init(int root,int l,int r)
{
date[root].l=l;
date[root].r=r;
if(l==r) {
date[root].sum=A[l];
return;
}
int mid=(l+r)>>1;
init(root*2,l,mid);
init(root*2+1,mid+1,r);
date[root].sum=date[root*2].sum+date[root*2+1].sum;
}
void update(int root,int a,int b,ll c)
{
if(date[root].val!=0) {
date[root*2].val+=date[root].val;
date[root*2+1].val+=date[root].val;
date[root*2].sum+=date[root].val*(date[root*2].r-date[root*2].l+1);
date[root*2+1].sum+=date[root].val*(date[root*2+1].r-date[root*2+1].l+1);
date[root].val=0;
}
if(date[root].l==a&&date[root].r==b) {
date[root].val=c;
date[root].sum+=c*(date[root].r-date[root].l+1);
return;
}
int mid=(date[root].l+date[root].r)>>1;
if(a<=mid&&b<=mid) update(root*2,a,b,c);
else if(a>mid&&b>mid) update(root*2+1,a,b,c);
else {
update(root*2,a,mid,c);
update(root*2+1,mid+1,b,c);
}
date[root].sum=date[root*2].sum+date[root*2+1].sum;
}
ll query(int root,int a,int b)
{
if(date[root].val) {
date[root*2].val+=date[root].val;
date[root*2+1].val+=date[root].val;
date[root*2].sum+=date[root].val*(date[root*2].r-date[root*2].l+1);
date[root*2+1].sum+=date[root].val*(date[root*2+1].r-date[root*2+1].l+1);
date[root].val=0;
}
if(date[root].l==a&&date[root].r==b) return date[root].sum;
int mid=(date[root].l+date[root].r)>>1;
if(a<=mid&&b<=mid) return query(root*2,a,b);
else if(a>mid&&b>mid) return query(root*2+1,a,b);
return query(root*2,a,mid)+query(root*2+1,mid+1,b);
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++) scanf("%lld",&A[i]);
init(1,1,n);
for(int i=1;i<=q;i++) {
scanf("%s",&ord);
if(ord=='C') {
int a,b;
ll c;
scanf("%d%d%lld",&a,&b,&c);
update(1,a,b,c);
}
else {
int a,b;
scanf("%d%d",&a,&b);
printf("%lld\n",query(1,a,b));
}
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator