| ||||||||||
| 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 | |||||||||
wa sos#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int left,right,mid;
int lch,rich,count;
}root[100010];
int top;
void marktree(int cnt,int a,int b){
root[cnt].left=a;
root[cnt].right=b;
root[cnt].count=0;
if(a+1==b)return ;
int mid=root[cnt].mid=(a+b)>>1;
root[cnt].lch=++top;
marktree(top,a,mid);
root[cnt].rich=++top;
marktree(top,mid,b);
}
inline void markchild(int cnt){
if(root[cnt].count==-20000)return ;
int le=root[cnt].lch,ri=root[cnt].rich;
root[le].count=root[ri].count=root[cnt].count;
root[cnt].count=-20000;
}
inline void markfather(int cnt){
int le=root[cnt].lch,ri=root[cnt].rich;
if(root[le].count==root[ri].count)root[cnt].count=root[le].count;
}
void inseart(int s,int cnt,int a,int b){
if(a==root[cnt].left&&b==root[cnt].right)
{
if(root[cnt].count!=-20000)root[cnt].count+=s;
else
{
inseart(s,root[cnt].lch,a,root[cnt].mid);
inseart(s,root[cnt].rich,root[cnt].mid,b);
}
return ;
}
markchild(cnt);
if(b<=root[cnt].mid)inseart(s,root[cnt].lch,a,b);
else if(a>=root[cnt].mid)inseart(s,root[cnt].rich,a,b);
else
{
inseart(s,root[cnt].lch,a,root[cnt].mid);
inseart(s,root[cnt].rich,root[cnt].mid,b);
}
markfather(cnt);
}
long long sum;
void dfs(int cnt,int a,int b){
if(a==root[cnt].left&&b==root[cnt].right)
{
if(root[cnt].count!=-20000)sum+=(long long)(b-a)*(long long)root[cnt].count;
else
{
dfs(root[cnt].lch,a,root[cnt].mid);
dfs(root[cnt].rich,root[cnt].mid,b);
}
return ;
}
if(root[cnt].left+1==root[cnt].right)return ;
if(b<=root[cnt].mid)dfs(root[cnt].lch,a,b);
else if(a>=root[cnt].mid)dfs(root[cnt].rich,a,b);
else
{
dfs(root[cnt].lch,a,root[cnt].mid);
dfs(root[cnt].rich,root[cnt].mid,b);
}
}
long long c[100010],a[100010];
inline void init(int n){
int i,x;
memset(c,0,sizeof(c));
for(i=1;i<=n;++i)
{
c[i]+=a[i];
for(x=i,x+=(x&(x^(x-1)));x<=n;x+=(x&(x^(x-1))))
c[x]+=a[i];
}
}
inline long long Sum(int a,int b){
long long s1,s2;
int x;
for(x=a,s1=0;x>0;x-=(x&(x^(x-1))))
s1+=c[x];
for(x=b,s2=0;x>0;x-=(x&(x^(x-1))))
s2+=c[x];
return s2-s1;
}
int main()
{
int n,q,i,x,y,c;
long long sumx;
char str[5];
while(scanf("%d%d",&n,&q)!=EOF)
{
for(i=1;i<=n;++i)
scanf("%lld",a+i);
init(n);
top=0;
marktree(0,0,n+1);
for(i=0;i<q;++i)
{
scanf("%s",str);
if(str[0]=='Q')
{
scanf("%d%d",&x,&y);
sumx=Sum(x-1,y);
sum=0;
dfs(0,x,y+1);
sumx+=sum;
printf("%lld\n",sumx);
}
else
{
scanf("%d%d%d",&x,&y,&c);
inseart(c,0,x,y+1);
}
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator