Cod sursa(job #1996124)

Utilizator infomaxInfomax infomax Data 30 iunie 2017 11:30:04
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <cstdio>

using namespace std;

FILE *F = fopen("datorii.in", "r"), *G = fopen("datorii.out", "w");

int k, p, n, m, x, y, z, v[15003], t[4*15010], s;

void upd(int rad, int st, int dr)
{
    if(st == dr)
    {
        t[rad] += k;
        return;
    }

    int mij = (st + dr) >> 1;
    if(p <= mij) upd(2 * rad + 1, st, mij);
    else upd(2*rad+2, mij+1, dr);

    t[rad] = t[2*rad+1] + t[2*rad+2];
}

void sum(int rad, int st, int dr, int l, int r)
{
    if(st >= l && r >= dr) {s += t[rad]; return;}
    if(st > r || dr < l) {return;}
    int mij = (st + dr) >> 1;
    sum(2*rad+1, st, mij, l, r);
    sum(2*rad+2, mij+1, dr, l, r);
}

int main()
{
    fscanf(F,"%d%d ", &n, &m);
    for(int i = 0; i < n; ++ i)
    {
        fscanf(F, "%d ", &v[i]);
        p = i; k = v[i];
        upd(0, 0, n - 1);
    }
    for(int i = 0; i < m; ++ i)
    {
        fscanf(F, "%d%d%d ", &x, &y, &z);
        if(x == 0)
        {
            p = y-1; k = -z;
            upd(0, 0, n - 1);
        }
        else
        {
            s = 0;
            sum(0, 0, n-1, y - 1, z - 1);
            fprintf(G, "%d\n", s);
        }
    }
    return 0;
}