poj3468区间延迟更新模板题

#include<stdio.h>
#include<string.h>
#define N 100000
struct st{
 int x,y;
 __int64 yanchi,sum;
}a[N*4];
__int64 b[N];
void build(int t,int x,int y) {
 a[t].x=x;
 a[t].y=y;
 a[t].yanchi=0;
 if(x==y) {
  a[t].sum=b[x];
  return ;
 }
 int temp=t*2;
 int mid=(a[t].x+a[t].y)/2;
 build(temp,x,mid);
 build(temp+1,mid+1,y);
 a[t].sum=a[temp].sum+a[temp+1].sum;
 return ;
}
void change(int t,int x,int y,int z) {
 if(a[t].x==x&&a[t].y==y) {
  a[t].yanchi+=z;
  return ;
 }
 a[t].sum+=(y-x+1)*z;
 int temp=t*2;
 int mid=(a[t].x+a[t].y)/2;
 if(y<=mid)
  change(temp,x,y,z);
 else
  if(x>mid)
   change(temp+1,x,y,z);
  else {
   change(temp,x,mid,z);
   change(temp+1,mid+1,y,z);
  }
  return ;
}
__int64 qury(int t,int x,int y) {
 if(a[t].x==x&&a[t].y==y)
  return a[t].sum+(y-x+1)*a[t].yanchi;
   int temp=t<<1;
   int mid=(a[t].y+a[t].x)/2;
   a[temp+1].yanchi+=a[t].yanchi;
   a[temp].yanchi+=a[t].yanchi;
   a[t].sum+=a[t].yanchi*(a[t].y-a[t].x+1);
   a[t].yanchi=0;
   if(y<=mid)
    return qury(temp,x,y);
   else
    if(x>mid)
     return qury(temp+1,x,y);
    else
     return qury(temp,x,mid)+qury(temp+1,mid+1,y);
}
int main() {
 int i,j,k,n,m;
 char s[100];
 while(scanf("%d%d",&n,&m)!=EOF) {
  for(i=1;i<=n;i++)
   scanf("%I64d",&b[i]);
  build(1,1,n);
  while(m--) {
   scanf("%s",s);
   if(s[0]=='Q') {
    scanf("%d%d",&i,&j);
    printf("%I64d\n",qury(1,i,j));
   }
   else {
    scanf("%d%d%d",&i,&j,&k);
    change(1,i,j,k);
   }

  }
 }
 return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值