Cod sursa(job #2339074)

Utilizator victorv88Veltan Victor victorv88 Data 8 februarie 2019 12:32:59
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <iostream>
#include <fstream>
#define MAX_VAL 15005

using namespace std;

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

int n, m, tree[4*MAX_VAL];

int update_tree(int st, int dr, int pos, int ind, int val_added)
{
    if (st==dr)
    {
        tree[pos]+=val_added;
        return val_added;
    }
    int mij=(st+dr)/2;
    if (ind<=mij)
    {
        tree[pos]+=update_tree(st,mij,pos*2,ind,val_added);
    }
    else
    {
        tree[pos]+=update_tree(mij+1,dr,pos*2+1,ind,val_added);
    }
    return val_added;
}

int query_tree(int st, int dr, int pos, int st_query, int dr_query)
{
    if (st<st_query && dr<st_query || st>dr_query && dr>dr_query)
    {
        return 0;
    }
    if(st>=st_query && dr<=dr_query)
    {
        return tree[pos];
    }
    int mij=(st+dr)/2;
    return query_tree(st,mij,pos*2,st_query,dr_query)+query_tree(mij+1,dr,pos*2+1,st_query,dr_query);
}

int main() {
    int tip,st,dr;
    int x;
    f >> n >> m;
    for (int i=1; i<=n; i++)
    {
        f >> x;
        update_tree(1,n,1,i,x);
    }
    for (int query=1;query<=m;++query)
    {
        f >> tip >> st >> dr;
        if (tip==0)
        {
            update_tree(1,n,1,st,-dr);
        }
        else
        {
            g << query_tree(1,n,1,st,dr) << '\n';
        }
    }
    return 0;
}