Cod sursa(job #1151902)

Utilizator andreiagAndrei Galusca andreiag Data 24 martie 2014 13:47:23
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <fstream>
#include <string.h>

using namespace std;
const int Nmax = 4*15000;
int A[Nmax];
int sum, pw = 1, a, b;

void update(int pos, int num)
{
    int t = pos + pw -1;
    A[t] -= num;
    while (t /= 2)
    {
        A[t] = A[2*t] + A[2*t+1];
    }
}
void querry(int nod, int st, int dr)
{
    if (a <= st && dr <= b)
    {
        sum += A[nod];
        return;
    }
    int mid = (st + dr) / 2;
    if (a <= mid) querry(2*nod,   st,    mid);
    if (mid < b)  querry(2*nod+1, mid+1, dr);
}

int main()
{
    ifstream f ("datorii.in");
    ofstream g ("datorii.out");
    int N, M, q;

    f >> N >> M;
    memset(A, 0, sizeof(A));
    pw = 1;
    while (pw < N) pw *= 2;

    for (int i = 0; i < N; i++)
        f >> A[pw + i];

    for (int i = pw - 1; i; i--)
        A[i] = A[2*i] + A[2*i+1];
    
    while(M--)
    {
        f >> q >> a >> b;
        if (q == 0) update(a, b);
        else
        {
            sum = 0;
            querry(1, 1, pw);
            g << sum << '\n';
        }
    }

    return 0;
}