Cod sursa(job #1827526)

Utilizator deresurobertoFMI - Deresu Roberto deresuroberto Data 11 decembrie 2016 21:50:38
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <fstream>
#define sz 15000
#define zeros(x) ( (x ^ (x - 1)) & x ) //cea mai mica putere a lui 2 care apartine lui x
using namespace std;
int n, m, type, day, val, leftDay, rightDay, aib[sz+1];

ifstream fin("datorii.in");
ofstream fout("datorii.out");

void Add(int aib[], int aibSize, int p, int val)
{
    for (int i = p; i <= aibSize; i += zeros(i))
        aib[i] += val;
}

int Compute(int aib[], int p)
{
    int result = 0;
    for (int i = p; i > 0; i -= zeros(i))
        result += aib[i];

    return result;
}

int Compute(int aib[], int left, int right)
{
    return Compute(aib, right) - Compute(aib, left - 1);
}

int main()
{
    fin >> n >> m;


    for (int i = 1; i <= n; i++)
    {
        fin >> val;
        aib[i] = zeros(i);
        Add(aib, n, i, val);
    }

    for ( ; m; m--)
    {
        fin >> type;

        if (type == 0)
        {
            fin >> day >> val;
            Add(aib, n, day, -val);
        }
        else
        {
            fin >> leftDay >> rightDay;
            fout << Compute(aib, leftDay, rightDay) << "\n";
        }
    }

    return 0;
}