Дерево отрезков. Нахождение суммы и присвоение

Решал задачу: Дан массив из N элементов, нужно научиться находить сумму чисел на отрезке.

Формат ввода

Первая строка содержит два целых числа N и K — число чисел в массиве и количество запросов. ( 1 ≤ N ≤ 1 0 0 0 0 0 ) , ( 0 ≤ K ≤ 1 0 0 0 0 0 ) . Следующие K строк содержат запросы “A i x” — присвоить i -му элементу массива значение x ( 1 ≤ i ≤ n , 0 ≤ x ≤ 1 0 ^ 9 ) “Q l r” — найти сумму чисел в массиве на позициях от l до r . ( 1 ≤ l ≤ r ≤ n ) Изначально в массиве живут нули.

Формат вывода

На каждый запрос вида Q l r нужно вывести единственное число — сумму на отрезке.

Пример: Ввод

5 9

A 2 2

A 3 1

A 4 2

Q 1 1

Q 2 2

Q 3 3

Q 4 4

Q 5 5

Q 1 5 Вывод: 0 2 1 2 0 5 Вот мой код:

void update(int v,int tl,int tr, int pos,int x,vector<ll>& t){

    if(tl==tr)
        t[v]=x;

    else{
        int tm=(tl+tr)>>1;

        if(pos<=tm)
            update(v*2,tl,tm,pos,x,t);
        else
            update(v*2+1,tm+1,tr,pos,x,t);

        t[v]=t[v*2]+t[v*2+1];
    }

}

int get(int v,int tl,int tr,int l,int r,vector<ll>& t){
    if(tl==l&&tr==r)
        return t[v];

    int ans=0;
    int tm=(tl+tr)>>1;

    if(l<=tm)
        ans+=get(v*2,tl,tm,l,min(r,tm),t);
    if(r>tm)
        ans+=get(v*2+1,tm+1,tr,max(l,tm+1),r,t);

    return ans;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n,k,l,r;
    cin>>n>>k;

    vector<ll> t(4*n);

    char c;

    for (int i=0;i<k;++i){
        cin>>c;
        cin>>l>>r;

        if(c=='A')
            update(1,1,n,l,r,t);
        else
            cout<<get(1,1,n,l,r,t)<<'\n';
    }

    return 0;
}

Программа правильно работает на примере, проходит 4 теста, а затем выдает неправильный результат. Подскажите, пожалуйста, в чем может быть ошибка.


Ответы (0 шт):