Cod sursa(job #1882055)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 16 februarie 2017 22:10:04
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <cstdio>

using namespace std;

int n, v[15005*4], sol;
FILE*f=freopen("datorii.in","r",stdin);
FILE*g=freopen("datorii.out","w",stdout);

void update(int nod, int st, int dr, int poz, int val)
{
    if(st == dr){
        v[nod] += val;
        return;
    }
    int m = (st+dr)/2;
    if(m >= poz)
        update(2*nod, st, m, poz, val);
    else
        update(2*nod+1, m+1, dr, poz, val);
    v[nod] = v[nod*2] + v[nod*2+1];
}

void ask(int nod, int st, int dr, int f, int l)
{
    if(st >= f && dr <= l){
        sol += v[nod];
        return;
    }
    int m = (st+dr)/2;
    if(m >= f)
        ask(2*nod, st, m, f, l);
    if(m < l)
        ask(2*nod + 1, m+1, dr, f, l);
}

inline void read(int &nr)
{
    while(!isdigit(buff[pos])) if(++pos == buff_size) fread(buff,  1,buff_size, stdin), pos = 0;
    nr = 0;
    while(isdigit(buff[pos]))
    {
        nr = (nr<<1)+(nr<<3)+ buff[pos] - 48;
        if(++pos == buff_size) fread(buff, 1, buff_size, stdin), pos = 0;
    }
}

inline  void write(int X) {
    static char digs[10];
    int n = 0, q;
    do {
        q = X / 10;
        digs[n++] = X - (q << 1) - (q << 3) + 48;

        X = q;
    } while (X);
    while (n--) {
        putChar(digs[n]);
    }

}

inline void putChar(const char &C) {
    outBuff[outPtr++] = C;
    if (outPtr == buff_size) {
        fwrite(outBuff, 1, buff_size, stdout);
        outPtr = 0;
    }
}

int main()
{
    int m;
    read(n);
    read(m);
    for (int i = 1; i <= n; ++i){
        int x;
        read(x);
        update(1, 1, n, i, x);
    }
    while(m--){
        int t, a, b;
        read(t);
        read(a);
        read(b);
        if(t == 0)
            update(1, 1, n, a, -b);
        else{
            sol = 0;
            ask(1, 1, n, a, b);
            write(sol);
            putChar('\n');
        }
    }
    fwrite(outBuff, 1, outPtr, stdout);
    return 0;
}