找不到错误的Sement树:子数组中的最小值

时间:2019-04-05 05:45:24

标签: c++11 tree segment-tree

我是数据结构和算法的新手,无法在我的代码中发现问题的错误

范围最小查询

给定大小为N的数组A,此数组上有两种查询。

  1. q l r:在此查询中,您需要在子数组A [l:r]中打印最小值。
  2. u x y:在此查询中,您需要更新A [x] = y。

输入:测试用例的第一行包含两个整数N和Q,数组A的大小和查询数。

第二行包含N个以空格分隔的整数,即A的元素。 接下来的Q行包含两个查询之一。

输出:

对于每个类型1查询,请在子数组A [l:r]中打印最小元素。

约束:

1 ≤ N,Q,y ≤ 10^5
1 ≤ l,r,x≤N

#include<bits/stdc++.h>

using namespace std;

long a   [100001];
//global array to store input

long tree[400004];  
//global array to store tree

// FUNCTION TO BUILD SEGMENT TREE //////////

void build(long i,long start,long end)  //i = tree node  

{

    if(start==end)

    {
        tree[i]=a[start];

        return;

    }

    long mid=(start+end)/2;

    build(i*2,start,mid);

    build(i*2+1,mid+1,end);

    tree[i] = min(tree[i*2] , tree[i*2+1]);

}

//  FUNCTION TO UPDATE SEGMENT TREE //////////

void update  (long i,long start,long end,long idx,long val)

//idx = index to be updated 

// val = new value to be given at that index

{

    if(start==end)

        tree[i]=a[idx]=val;

    else
    {
        int mid=(start+end)/2;

        if(start <= idx and idx <= mid)

            update(i*2,start,mid,idx,val);

        else

            update(i*2+1,mid+1,end,idx,val);

        tree[i] = min(tree[i*2] , tree[i*2+1]);

    }

}

// FUNCTION FOR QUERY

long query(long i,long start,long end,long l,long r)   
{
    if(start>r || end<l || start > end)

        return INT_MAX;
    else

        if(start>=l && end<=r)

        return tree[i];

    long mid=(start+end)/2;

    long ans1 = query(i*2,start,mid,l,r);
    long ans2 = query(i*2+1,mid+1,end,l,r);

    return min(ans1,ans2);

}

int main()

{

    long n,q;

    cin>>n>>q;

    for(int i=0 ; i<n ; i++)

        cin>>a[i];

    //for(int i=1 ; i<2*n ; i++)    cout<<tree[i]<<"  ";   cout<<endl;

    build(1,0,n-1);

    //for(int i=1 ; i<2*n ; i++)    cout<<tree[i]<<"  ";    cout<<endl;


    while(q--)
    {
            long l,r;


            char ch;

            cin>>ch>>l>>r;

            if(ch=='q')

                cout<<query(1,0,n-1,l-1,r-1)<<endl;

            else

                update(1,0,n-1,l,r);

    }

    return 0;

}

示例:input

5 15
1 5 2 4 3
q 1 5
q 1 3
q 3 5
q 1 5
q 1 2
q 2 4
q 4 5
u 3 1
u 3 100
u 3 6
q 1 5
q 1 5
q 1 2
q 2 4
q 4 5

预期输出:

1
1
2
1
1
2
3
1
1
1
4
3

1 个答案:

答案 0 :(得分:0)

所有给定值似乎都基于1的索引:1 ≤ l,r,x ≤ N

您选择使用基于0的索引来构建细分树,因此所有查询和更新也应使用相同的索引。

所以这部分是错误的,因为您需要设置A [x] = y,并且因为您使用基于0的索引,所以您的代码实际上设置了A [x + 1] = y

update(1,0,n-1,l,r);

要解决此问题,请更改为:

update(1,0,n-1,l-1,r);