Cod sursa(job #2414364)

Utilizator marinaoprOprea Marina marinaopr Data 24 aprilie 2019 15:32:21
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <stdio.h>

#define NMAX 15005

using namespace std;

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

int n,q,cerinta,a,b,poz,start,finish,sum[4*NMAX],i,val;

void update(int nod, int left, int right, int val)
{
    if(left == right)
    {
        sum[nod] += val;
        return;
    }

    int mid = (left+right) /2;
    if(poz <= mid)
        update(2*nod, left, mid, val);
    else
        update(2*nod+1, mid+1, right, val);

    sum[nod] += val;
}

int query(int nod, int left, int right)
{
    int r1 = 0, r2 = 0;

    if(start<=left and right<=finish)
        return sum[nod];

    int mid = (left+right) /2;
    if(start <= mid)
        r1 = query(2*nod, left, mid);
    if(finish > mid)
        r2 = query(2*nod+1, mid+1, right);

    return r1+r2;
}

int main()
{
    fscanf(fin, "%d%d", &n,&q);
    for(i=1; i<=n; ++i)
    {
        fscanf(fin, "%d", &val);
        poz = i;
        update(1, 1, n, val);
    }

    while(q)
    {
        fscanf(fin, "%d%d%d", &cerinta,&a,&b);

        if(cerinta)
        {
            start = a;
            finish = b;
            fprintf(fout, "%d\n", query(1, 1, n));
        }
        else
        {
            poz = a;
            update(1, 1, n, -b);
        }

        --q;
    }

    fclose(fin);
    fclose(fout);
    return 0;
}