Cod sursa(job #1824765)

Utilizator MithrilBratu Andrei Mithril Data 8 decembrie 2016 13:30:21
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");
int n,m,caz,x,y;
int arbore[4*15010];
void build(int,int,int);
void update(int,int,int,int,int);
int query(int,int,int,int,int);

int main()
{
    fin>>n>>m;
    build(1,1,n);
    for(int i=1;i<=m;i+=1)
    {
        fin>>caz>>x>>y;
        if(caz==0)
            update(1,1,n,x,y);
        else
            fout<<query(1,1,n,x,y)<<'\n';
    }
    return 0;
}

void build(int nod,int st,int dr)
{
    if(st==dr)
    {
        fin>>arbore[nod];
        return;
    }
    int leftNode=nod<<1, rightNode=nod<<1|1, mid=(st+dr)>>1;
    build(leftNode,st,mid);
    build(rightNode,mid+1,dr);

    arbore[nod]=arbore[leftNode]+arbore[rightNode];
}

int query(int nod,int st, int dr, int x, int y)
{
    if(x<=st && dr<=y)
        return arbore[nod];

    int leftNode=nod<<1, rightNode=nod<<1|1, mid=(st+dr)>>1;

    if(y<=mid)
        return query(leftNode,st,mid,x,y);
    else if(x>mid)
        return query(rightNode,mid+1,dr,x,y);
        else
            return query(leftNode,st,mid,x,y)+query(rightNode,mid+1,dr,x,y);
}

void update(int nod, int st, int dr, int pos, int val)
{
    if(st==dr)
    {
        arbore[nod]-=val;
        return;
    }

    int leftNode=nod<<1, rightNode=nod<<1|1, mid=(st+dr)>>1;

    if(pos<=mid)
        update(leftNode,st,mid,pos,val);
    else
        update(rightNode,mid+1,dr,pos,val);

    arbore[nod]=arbore[leftNode]+arbore[rightNode];
}