第二次来发帖了,
10 pts
输入
8 10
659 463 793 740 374 330 772 681
1 5 8 39
2 5 8
1 3 6 3
1 5 8 90
1 1 5 21
2 3 8
1 3 8 17
1 4 7 52
2 2 6
1 2 7 41
应该输出
2313
4281
3278
实际输出
2313
4203
3152
求调
代码
#include<bits/stdc++.h>
using namespace std;
#define lc i<<1
#define rc i<<1|1
#define mid (l+r)/2
int inPut[100000+1];
struct tree{
int l,r,sum,lazytag;
}t[100000001];
void push_down(int i)
{
t[lc].lazytag+=t[i].lazytag;
t[rc].lazytag+=t[i].lazytag;
t[lc].sum+=t[i].lazytag*(t[lc].r-t[lc].l+1);
t[rc].sum+=t[i].lazytag*(t[rc].r-t[rc].l+1);
t[i].lazytag=0;
}
void build(int i,int l,int r)
{
t[i].l=l;t[i].r=r;
if(l==r)
{
t[i].sum=inPut[l];
return ;
}
build(lc,l,mid);
build(rc,mid+1,r);
t[i].sum=t[lc].sum+t[rc].sum;
}
int search(int i,int l,int r)
{
//cout<<t[i].l<<" "<<t[i].r<<' '<<l<<' '<<r<<'\n';
if(l<=t[i].l&&r>=t[i].r)
{
return t[i].sum;
}
if(l>t[i].r||r<t[i].l)
{
return 0;
}
int rtrn=0;
push_down(i);
if(l<=t[lc].r)
{
rtrn+=search(lc,l,r);
}
if(r>=t[rc].l)
{
rtrn+=search(rc,l,r);
}
return rtrn;
}
void add(int i,int l,int r,int k)
{
if(l<=t[i].l&&r>=t[i].r)
{
t[i].lazytag=k;
t[i].sum+=(t[i].r-t[i].l+1)*t[i].lazytag;
return ;
}
push_down(i);
if(l<=t[lc].r)
{
add(lc,l,r,k);
}
if(r>=t[rc].l)
{
add(rc,l,r,k);
}
t[i].sum=t[lc].sum+t[rc].sum;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&inPut[i]);
}
build(1,1,n);
int op,x,y,k;
for(int i=1;i<=m;i++)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d%d%d",&x,&y,&k);
add(1,x,y,k);
}
if(op==2)
{
scanf("%d%d",&x,&y);
cout<<search(1,x,y)<<endl;
}
}
return 0;
}
Orz