这题的做法就像题目说的那样。
#include#include #include #include using namespace std;#define ll long longinline ll read(){ ll t=1,num=0;char c=getchar(); while(c>'9'||c<'0'){ if(c=='-')t=-1;c=getchar();} while(c>='0'&&c<='9'){num=num*10+c-'0';c=getchar();} return num*t;}const ll maxn=100010;ll mark[4*maxn],t[4*maxn],a[maxn],n,m;void build(ll ro,ll l,ll r){ mark[ro]=0; if(l==r){t[ro]=a[l];return;} ll mid=(l+r)>>1; build(ro*2,l,mid);build(ro*2+1,mid+1,r); t[ro]=t[ro*2]+t[ro*2+1];}void pushdown(ll ro,ll l,ll r){ ll mid=(l+r)>>1; if(mark[ro]&&l!=r){ mark[ro*2]+=mark[ro]; mark[ro*2+1]+=mark[ro]; t[ro*2]+=(mid-l+1)*mark[ro]; t[ro*2+1]+=(r-mid)*mark[ro]; mark[ro]=0; }}ll ask(ll ro,ll l,ll r,ll x,ll y){ if(x>r||y >1; return ask(ro*2,l,mid,x,y)+ask(ro*2+1,mid+1,r,x,y);}void change(ll ro,ll l,ll r,ll x,ll y,ll add){ if(x>r||y >1; change(ro*2,l,mid,x,y,add);change(ro*2+1,mid+1,r,x,y,add); t[ro]=t[ro*2]+t[ro*2+1];}int main(){ n=read();m=read(); for(ll i=1;i<=n;i++)a[i]=read(); build(1,1,n); for(ll i=1;i<=m;i++){ ll k=read(),x=read(),y=read(); if(k==1)change(1,1,n,x,y,read()); else printf("%lld\n",ask(1,1,n,x,y)); } return 0;}
一开始,wa了3个点。看了一下,突然发现。。
其实是输出没有lld。
本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。