Cod sursa(job #2624722)

Utilizator miramaria27Stroie Mira miramaria27 Data 5 iunie 2020 11:04:11
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <iostream>
#include <fstream>
using namespace std;

void build(int a[], int tree[], int start, int stop, int node)
{
    if(start==stop)
    {
        tree[node]=a[start];
    }
    else
    {
        int m=(start+stop)/2;
        build(a,tree,start,m,2*node);
        build(a,tree,m+1,stop,2*node+1);
        tree[node]=tree[2*node]+tree[2*node+1];

    }

}
int query(int tree[], int node, int start, int stop, int l, int r)
{
    if(stop<l || r<start)
        return 0;
    if(l<=start && stop<=r)
        return tree[node];

    int m=(start+stop)/2;
    int m1=query(tree,2*node,start,m,l,r);
    int m2=query(tree,2*node+1,m+1,stop,l,r);
    return m1+m2;

}
void update(int tree[], int a[],int node, int start, int stop,  int idx, int val)
{
    if(start==stop)
    {
        a[idx]-=val;
        tree[node]-=val;
    }
    else
    {
        int m=(start+stop)/2;
        if(start<=idx && idx<=m)
            update(tree,a,2*node,start,m,idx,val);
        else
            update(tree,a,2*node+1,m+1,stop,idx,val);

        tree[node]=tree[2*node]+tree[2*node+1];

    }
}


int main()
{

    ifstream in("datorii.in");
    ofstream out("datorii.out");
    int n, nr, a[15002],tree[40010];
    in>>n>>nr;
    for(int i=1; i<=n; i++)
        in>>a[i];

    build(a,tree,1,n,1);
    int x, y,opt;
    for(int i=1; i<=nr; i++)
    {
        in>>opt>>x>>y;
        switch(opt)
        {
        case 0:
        {
            update(tree,a,1,1,n,x,y);

            break;
        }
        case 1:
        {
            out<<query(tree,1,1,n,x,y)<<"\n";
            break;
        }
        }



    }
    return 0;

}