Cod sursa(job #2963231)

Utilizator AndreiMargaritMargarit Andrei AndreiMargarit Data 10 ianuarie 2023 15:54:11
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("datorii.in");
ofstream g("datorii.out");

const int nmax=15000;

int debt[nmax+1];
int segment_tree[nmax*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]=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,i,op,zi,valoare,st,dr;
    f>>n>>q;
    for(i=1;i<=n;i++)
    {
        f>>debt[i];
    }
    build(1,1,n);
    for(i=1;i<=q;i++)
    {
        f>>op;
        if(op==0)
        {
            f>>zi>>valoare;
            update(1,1,n,zi,valoare);
        }
        else
        {
            f>>st>>dr;
            g<<query(1,1,n,st,dr)<<'\n';
        }
    }
    return 0;
}