Cod sursa(job #1821119)

Utilizator dinu2000Enescu Dinu dinu2000 Data 2 decembrie 2016 17:47:15
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <stdio.h>
#define MAXN 15000

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

int N, M, MAX;
int v[MAXN + 1], arb[4 * MAXN];

void BUILD(int nod, int left, int right)
{
    if(left == right)
    {
        arb[nod] = v[left];
        return;
    }

    int mid = (left + right)/2;

    BUILD(nod * 2, left, mid);
    BUILD(nod * 2 + 1, mid + 1, right);

    arb[nod] = arb[nod * 2] + arb[nod * 2 + 1];
}


void UPDATE(int nod, int left, int right, int pos, int val)
{
    if(left == right)
    {
         arb[nod]-= val;
         return;
    }

    int mid = (left + right)/2;


    if(pos <= mid)
        UPDATE(nod * 2, left, mid, pos, val);

    else
        UPDATE(nod * 2 + 1, mid + 1, right, pos, val);

    arb[nod] = arb[nod * 2] + arb[nod * 2 + 1];
}

void QUERY(int nod, int left, int right, int a, int b)
{
    if(a <= left && right <= b)
    {
        MAX += arb[nod];
        return;
    }

    int mid = (left + right)/2;

    if(a <= mid)
        QUERY(nod * 2, left, mid, a, b);

    if(mid < b)
        QUERY(nod * 2 + 1, mid+1, right, a, b);
}


int main()
{
    int i, type, par1, par2;

    fscanf(fin, "%d %d", &N, &M);

    for(i=1; i<=N; i++)
        fscanf(fin, "%d", &v[i]);

    BUILD(1, 1, N);

    for(i=1; i<=M; i++)
    {
        fscanf(fin, "%d %d %d", &type, &par1, &par2);

        if(type == 0)
            UPDATE(1, 1, N, par1, par2);

        if(type == 1)
        {
            MAX = 0;
            QUERY(1, 1, 6, par1, par2);
            fprintf(fout, "%d\n", MAX);
        }

    }

    return 0;
}