Cod sursa(job #2502349)

Utilizator hurjui12AlexandruHurjui Alexandru-Mihai hurjui12Alexandru Data 30 noiembrie 2019 18:23:23
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <cctype>
#include <cstdio>
using namespace std;

FILE *fin = fopen("datorii.in", "r");
ofstream fout("datorii.out");

const int bsize = 1<<17;
char buff[bsize];
int poz = bsize;

inline char next()
{
    if (poz == bsize)
    {
        fread(buff, 1, bsize, fin);
        poz = 0;
    }
    return buff[poz++];
}

int nr()
{
    int x = 0;
    char c;
    do
    {
        c = next();
    } while (isdigit(c) == 0);
    while (isdigit(c))
    {
        x = x * 10 + c-48;
        c = next();
    }
    return x;
}

#define lsb(x) ( ( x^(x-1)) & x )

int n;

void update(int p, int val, int arb[])
{
    while (p <= n)
    {
        arb[p] = arb[p] + val;
        p = p + lsb(p);
    }
}

int query(int st, int dr, int arb[])
{
    int sdr, sst, p;
    sdr = sst = 0;
    p = st-1;
    while (p > 0)
    {
        sst = sst + arb[p];
        p = p - lsb(p);
    }
    p = dr;
    while (p > 0)
    {
        sdr = sdr + arb[p];
        p = p - lsb(p);
    }
    return sdr - sst;
}

int main()
{
    int arb[15001] = {}, m, i, x, y, t, p;
    n = nr();
    m = nr();
    for (i = 1; i<=n; i++)
    {
        x = nr();
        update(i, x, arb);
    }
    for (i = 1; i<=m; i++)
    {
        t = nr();
        x = nr();
        y = nr();
        if (t == 0)
            update(x, -y, arb);
        else
            fout << query(x, y, arb) << '\n';
    }
    return 0;
}