RT
奇怪的BUG:当第二行输入的末尾有空格时,程序就会终止运行,无法继续输入,也没有输出,也没有报错,一直卡在输入界面......
求助QwQ
输入:
5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4
代码:(线段树)
#include<cstdio>
#define ll long long
using namespace std;
int n,m;
ll ans;
long long tree[4*100020];
ll lazy[4*100020];
long long read()
{
long long num=0;
int f=1;
char c=getchar();
while(c<'0'||c>'9')if(c=='-'){f=-1;c=getchar();}
while('0'<=c&&c<='9')num=num*10+c-'0',c=getchar();
return num*f;
}
int build(int l,int r,int a)
{
//printf("1 ");
if(l==r)
{
tree[a]=read();
return tree[a];
}
int mid=(l+r)>>1;
tree[a] += build(l,mid,a<<1);
tree[a] += build(mid+1,r,(a<<1)|1);
return tree[a];
}
void push_up(int a)
{
tree[a] = tree[a<<1] + tree[(a<<1)|1];
}
void push_down(int a,int l,int r)
{
if(lazy[a])
{
lazy[a<<1] += lazy[a];
lazy[(a<<1)|1] += lazy[a];
tree[a<<1] += (((l+r)>>1)-l+1)*lazy[a];
tree[(a<<1)|1] += (r-((l+r)>>1))*lazy[a];
lazy[a]=0;
}
}
void change(int l,int r,int k,int ln,int rn,int a)
{
if(ln>=l && rn<=r)
{
lazy[a] += k;
tree[a] += (rn-ln+1)*k;
return;
}
if(ln==rn)return;
push_down(a,ln,rn);
int mid=(ln+rn)>>1;
if(rn>r||ln<l)
{
change(l,r,k,ln,mid,a<<1);
change(l,r,k,mid+1,rn,(a<<1)|1);
}
push_up(a);
}
void sum(int l,int r,int ln,int rn,int a)
{
// printf("1 ");
if(ln>=l && rn<=r)
{
ans += tree[a];
// printf("%d %d %d %d\n",ans,a,ln,rn);
return;
}
if(ln==rn)return;
push_down(a,ln,rn);
int mid=(ln+rn)>>1;
if(rn>r||ln<l)
{
sum(l,r,ln,mid,a<<1);
sum(l,r,mid+1,rn,(a<<1)|1);
}
push_up(a);
}
int main()
{
n=read(),m=read();
build(1,n,1);
// for(int i=1;i<=n*4;i++)printf("%lld ",tree[i]);
// printf("\n");
for(int i=1;i<=m;i++)
{
int z=read();
// printf("1 ");
if(z==1)
{
int z1=read(),z2=read(),k=read();
change(z1,z2,k,1,n,1);
}
else
{
int z1=read(),z2=read();
sum(z1,z2,1,n,1);
printf("%lld\n",ans);
ans=0;
}
}
}
(原题:P3372【模板】线段树1)
求dalao指教!QwQ