Cod sursa(job #3257962)

Utilizator Horia123144Musat Horia Gabriel Horia123144 Data 20 noiembrie 2024 11:39:05
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
const int N = 15000;
int debt[N + 1];
int segment_tree[N*4+1];
void build (int node,int left,int right){
    if(left==right)
        segment_tree[node]=debt[left];
    else{
        int middle=(left+right)/2;
        build(node*2,left,middle);
        build(node*2+1,middle+1,right);
        segment_tree[node]=segment_tree[node*2]+segment_tree[node*2+1];
    }
}
void update(int node, int left, int right, int day, int value){
     if(left==right)
        segment_tree[node]-=value;
     else{
        int middle=(left+right)/2;
        if(day<=middle)
            update(node*2,left,middle,day,value);
        else
            update(node*2+1,middle+1,right,day,value);
        segment_tree[node]=segment_tree[node*2]+segment_tree[node*2+1];
     }
}
int query(int node, int left, int right, int query_left, int query_right){
        if (query_left <= left && right <= query_right){
            return segment_tree[node];
        }else{
            int middle = (left + right) / 2;
            if (query_right <= middle)
                return query(node * 2, left, middle, query_left, query_right);
            if (middle+1<=query_left)
                return query(node * 2 + 1, middle + 1, right, query_left, query_right);
            return query(node * 2, left, middle, query_left, query_right) +query(node * 2 + 1, middle + 1, right, query_left, query_right);
        }
    }
int main()
{

    int n, q;
    in >> n>>q;
    for (int i = 1; i <= n; ++i)
        in >> debt[i];
    build(1, 1, n);

    while (q--)
    {
        int t;
        in >> t;

        if (t == 0)   // we pay 'value' money in day 'day'
        {
            int day, value;
            in>>day>>value;
            update(1, 1, n, day, value);
        }
        else    // return the amount of money that we have to pay between days 'left' and 'right'
        {
            int left, right;
            in >> left >> right;
            out << query(1, 1, n, left, right) << "\n";
        }
    }
}