C++11 延迟传播的段树中出现错误

C++11 延迟传播的段树中出现错误,c++11,data-structures,tree,segment-tree,C++11,Data Structures,Tree,Segment Tree,这是SPOJ“SEGSQRSS-带分段树的平方和”的问题。问题的链接是我试图使用延迟传播来实现这一点,但找不到正确的解决方案,有人能帮助我解决问题吗 #include <map> #include <set> #include <math.h> #include <string> #include <vector> #include <stdio.h> #include <iostream> #include &

这是SPOJ“SEGSQRSS-带分段树的平方和”的问题。问题的链接是我试图使用延迟传播来实现这一点,但找不到正确的解决方案,有人能帮助我解决问题吗

#include <map>
#include <set>
#include <math.h>
#include <string>
#include <vector>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define inf 0x7fffffff
#define mod 1000000007
#define ll long long int
#define all(c) c.begin(),c.end()
#define tr(c,i) for(typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
// it uses lazy propagation
struct seg
{
    ll x;// which stores the value of the 2*(sum of the elements of the segment)
    ll sum;// stores the sum of the square of the elements of the segment
};
seg tree[2000050];
ll arr[100005],lazyadd[2000050],lazycha[2000050];
ll query_tree(ll node,ll a,ll b,ll i,ll j);
void build_tree(ll node,ll a,ll b);
void build_tree(ll node,ll a,ll b)
{
    if(a>b)return ;
    if(a==b)
    {
        tree[node].x=2*arr[a];
        tree[node].sum=arr[a]*arr[a];
        return ;
    }
    build_tree(2*node,a,a+((b-a)/2));
    build_tree(2*node+1,1+a+((b-a)/2),b);

    tree[node].x=tree[2*node].x+tree[2*node+1].x;
    tree[node].sum=tree[2*node].sum+tree[2*node+1].sum;
    return ;
    }

ll query_tree(ll node,ll a,ll b,ll i,ll j)
{
    if(a > b || a > j || b < i) return 0;
    ll ans;
    ll mid=(a+b)/2;
    if((lazyadd[node]!=0)||(lazycha[node]!=0))
    {
        // this is for type 0
        if(i!=j){
        if(lazycha[node]!=0){
        tree[2*node].sum=(mid-a+1)*lazycha[node]*lazycha[node];
        tree[2*node].x=(mid-a+1)*lazycha[node]*2;
        tree[2*node+1].sum=(b-mid)*lazycha[node]*lazycha[node];
        tree[2*node+1].x=(b-mid)*lazycha[node]*2;
        lazycha[2*node]=lazycha[2*node]+lazycha[node];
        lazycha[2*node+1]=lazycha[2*node+1]+lazycha[node];
        }

        // this is for type 1
        if(lazyadd[node]!=0){
        tree[2*node].sum=tree[2*node].sum+tree[2*node].x*lazyadd[node]+(mid-a+1)*lazyadd[node]*lazyadd[node];
        tree[2*node].x=tree[2*node].sum+(mid-a+1)*lazyadd[node]*2;
        tree[2*node+1].sum=tree[2*node+1].sum+tree[2*node+1].x*lazyadd[node]+(b-mid)*lazyadd[node]*lazyadd[node];
        tree[2*node+1].sum=tree[2*node+1].sum+(b-mid)*lazyadd[node]*2;

        lazyadd[2*node]=lazyadd[2*node]+lazyadd[node];
        lazyadd[2*node+1]=lazyadd[2*node+1]+lazyadd[node];

      }

        }
        lazyadd[node]=0;
        lazycha[node]=0;
    }

    if((i<=a)&&(b<=j))return tree[node].sum;

    ll ans1=query_tree(2*node,a,a+((b-a)/2),i,j);
    ll ans2=query_tree(2*node+1,a+((b-a)/2)+1,b,i,j);
    ans=ans1+ans2;
    return ans;
}

void update_tree(ll node,ll a,ll b,ll i,ll j,ll value,ll type)
{
    if(a > b || a > j || b < i) return ;

    ll mid=(a+b)/2;
    if((lazyadd[node]!=0)||(lazycha[node]!=0))
    {
        // this is for type 0
        if(i!=j){
        if(lazycha[node]!=0){
        tree[2*node].sum=(mid-a+1)*lazycha[node]*lazycha[node];
        tree[2*node].x=(mid-a+1)*lazycha[node]*2;
        tree[2*node+1].sum=(b-mid)*lazycha[node]*lazycha[node];
        tree[2*node+1].x=(b-mid)*lazycha[node]*2;
        lazycha[2*node]=lazycha[2*node]+lazycha[node];
        lazycha[2*node+1]=lazycha[2*node+1]+lazycha[node];
        }

        // this is for type 1
        if(lazyadd[node]!=0){
        tree[2*node].sum=tree[2*node].sum+tree[2*node].x*lazyadd[node]+(mid-a+1)*lazyadd[node]*lazyadd[node];
        tree[2*node].x=tree[2*node].sum+(mid-a+1)*lazyadd[node]*2;
        tree[2*node+1].sum=tree[2*node+1].sum+tree[2*node+1].x*lazyadd[node]+(b-mid)*lazyadd[node]*lazyadd[node];
        tree[2*node+1].sum=tree[2*node+1].sum+(b-mid)*lazyadd[node]*2;

        lazyadd[2*node]=lazyadd[2*node]+lazyadd[node];
        lazyadd[2*node+1]=lazyadd[2*node+1]+lazyadd[node];

      }

        }
        lazyadd[node]=0;
        lazycha[node]=0;
    }

    if((i<=a)&&(b<=j))
    {
        if(type==0)
        {
            tree[node].sum=(b-a+1)*value*value;
            tree[node].x=(b-a+1)*value*2;
            lazycha[node]+=value;
            return;
        }
        else if(type==1)
        {
            tree[node].sum=tree[node].sum+tree[node].x*value+(b-a+1)*value*value;
            tree[node].x+=(b-a+1)*value*2;
            lazyadd[node]+=value;
            return;
        }
    }



    update_tree(2*node,a,a+((b-a)/2),i,j,value,type);
    update_tree(2*node+1,1+a+((b-a)/2),b,i,j,value,type);
    tree[node].sum=tree[2*node].sum+tree[2*node+1].sum;

    }

int main()
{
    ll t,x,n,c,i,j,v;
    cin>>t;
    for(x=1;x<=t;x++){
            memset(lazyadd,0,sizeof(lazyadd));
            memset(lazycha,0,sizeof(lazycha));
    ios_base::sync_with_stdio(0);//this is the boost :)
    scanf("%lld%lld",&n,&c);
    for(i=1;i<=n;i++)scanf("%lld",&arr[i]);//cin>>arr[i];
    build_tree(1,1,n);
    cout<<"Case "<<x<<endl;
    while(c--)
    {
        int type;
        scanf("%d",&type);
        if(type==2)
        {
            scanf("%lld%lld",&i,&j);
            printf("%lld\n",query_tree(1,1,n,i,j));
        }
        else
        {
            scanf("%lld%lld%lld",&i,&j,&v);
            update_tree(1,1,n,i,j,v,type);
        }
    }
  }
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
#定义inf 0x7fffffff
#定义mod 100000007
#定义ll long long int
#定义所有(c)c.begin(),c.end()
#为(typeof((c.begin())i=(c.begin();i!=(c.end();i++)定义tr(c,i)
//它使用延迟传播
结构分段
{
ll x;//它存储2*(段的元素之和)的值
ll sum;//存储段元素的平方和
};
seg-tree[2000050];
ll arr[100005]、lazyadd[2000050]、lazycha[2000050];
ll查询树(ll节点、lla、llb、lli、llj);
无效构建树(ll节点、ll a、ll b);
无效生成树(ll节点、ll a、ll b)
{
如果(a>b)返回;
如果(a==b)
{
树[node].x=2*arr[a];
树[node].sum=arr[a]*arr[a];
返回;
}
构建_树(2*节点,a,a+((b-a)/2));
构建_树(2*node+1,1+a+((b-a)/2),b);
树[node].x=树[2*节点].x+树[2*节点+1].x;
树[node]。总和=树[2*节点]。总和+树[2*节点+1]。总和;
返回;
}
ll查询树(ll节点、ll a、ll b、ll i、ll j)
{
如果(a>b|a>j|b请描述错误和您的期望。您的输入是什么?问题是,当我提交解决方案时,我找不到错误,因为它给出了错误的答案。我想知道我哪里出了问题。请提供输入案例,说明哪里出了错。“给出错误的答案”-->错误的答案是什么?您的输入是什么?