Cod sursa(job #1639289)

Utilizator bt.panteaPantea Beniamin bt.pantea Data 8 martie 2016 11:40:55
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <iostream>
#include <fstream>
#define MAX 20000
using namespace std;
ifstream f ("datorii.in");
ofstream g ("datorii.out");
int n,m,Start,Finish,suma,SumArb[100*MAX],Val,Pos,x;

void Form (int nod, int left, int right)
{
    if (left==right)
    {
        SumArb[nod]=Val;
        return;
    }
    int div=(left+right)/2;
    if (Pos<=div) Form(2*nod,left, div);
    else Form(2*nod+1, div+1, right);
    SumArb[nod]=SumArb[2*nod]+SumArb[2*nod+1];
}
void Query(int nod, int left, int right)
{
    if (left>=Start&& right<=Finish)
    {
        suma+=SumArb[nod];
        return;
    }

    int div=(left+right)/2;
    if (div>=Start) Query(2*nod, left, div);
    if (div<Finish) Query(2*nod+1, div+1, right);
}
int FindNod(int nod, int left, int right)
{
    if (left==right) return nod;

    int div=(left+right)/2;
    if (Pos<=div) return FindNod(2*nod, left, div);
    else return FindNod(2*nod+1,div+1, right);
}
void Update(int nod, int x)
{
    SumArb[nod]-=x;
    if (nod>1) Update(nod/2,x);
}
int main()
{
    f>>n>>m;
    for (int i=1;i<=n;i++)
    {
        f>>x;
        Pos=i;
        Val=x;
        Form(1,1,n);
    }
    for (int i=1;i<=m;i++)
    {
        int p,a,b;
        f>>p>>a>>b;
        if (p)
        {
            Start=a;
            Finish=b;
            suma=0;
            Query(1,1,n);
            g<<suma<<'\n';
        }
        else
        {
            Pos=a;
            Update(FindNod(1,1,n),b);
        }
    }
    return 0;
}