Cod sursa(job #1797143)

Utilizator dragos_vecerdeaVecerdea Dragos dragos_vecerdea Data 4 noiembrie 2016 00:18:58
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <stdio.h>

using namespace std;
FILE*fin = fopen("datorii.in" , "r");
FILE *fout = fopen("datorii.out" , "w");
#define MAXN 450000
int ArbPlata [MAXN];
int val , pos , start , finish , suma;
void updateplus (int nod, int st ,int dr)
{
    if(st == dr)
    {
        ArbPlata[nod] += val;
        return;
    }
    else
    {
        int mij = (st + dr) / 2;
        if(pos <= mij) updateplus(2 * nod, st , mij);
        else updateplus(2 * nod + 1, mij + 1, dr);
        ArbPlata[nod] = ArbPlata[2 * nod] + ArbPlata[2 * nod + 1];
    }
}
void updateminus (int nod, int st ,int dr)
{
    if(st == dr)
    {
        ArbPlata[nod] -= val;
        return;
    }
    else
    {
        int mij = (st + dr) / 2;
        if(pos <= mij) updateminus(2 * nod, st , mij);
        else updateminus(2 * nod + 1, mij + 1, dr);
        ArbPlata[nod] = ArbPlata[2 * nod] + ArbPlata[2 * nod + 1];
    }
}
void interogare(int nod ,int st ,int dr)
{
    if(start <= st && dr <= finish)
    {
        suma+=ArbPlata[nod];
    }
    else
    {
        int mij = (st + dr) / 2;
        if(start <= mij) interogare(2 * nod , st , mij);
        if(finish > mij) interogare(2 * nod + 1 , mij + 1 , dr);
    }

}
int main()
{
    int a , b , tip , n , m ,x;
    fscanf(fin , "%d%d", &n, &m);
    for(int i = 1; i <= n; i ++)
    {
        fscanf(fin , "%d" , &x);
        pos = i;
        val = x;
        updateplus(1,1,n);
    }
    for(int i = 1; i <= m; i ++)
    {
        fscanf(fin , "%d%d%d" , &tip , &a , &b);
        if(tip == 0)
        {
            pos = a;
            val = b;
            updateminus(1,1,n);
        }
        else
        {
            start = a;
            finish = b;
            suma = 0;
            interogare(1,1,n);
            fprintf(fout , "%d\n" , suma);
        }
    }
    return 0;
}