Cod sursa(job #2044617)

Utilizator costi2Radu Canu costi2 Data 21 octombrie 2017 11:24:30
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

ofstream out("datorii.out");

int getParent(int index){
        return index - (index & -index);
}

int getNext(int index){
        return index + (index & -index);
}

int getSum(int vec[],int index){

        int sum = 0;
        while(index > 0) {
                sum += vec[index];
                index = getParent(index);
        }
        return sum;
}

void UpdateValue(int vec[],int index, int val,int dim){
        while(index <= dim) {
                vec[index] += val;
                index = getNext(index);
        }
}

void UpdateValue1(int vec[],int index, int val,int dim){
        while(index <= dim) {
                vec[index] -= val;
                index = getNext(index);
        }
}


int main()
{
        int M,N;
        FILE * f = fopen("datorii.in","r");
        fscanf(f,"%d %d\n",&N,&M);
        int BitTree[N+1];
        memset(BitTree,0,sizeof(BitTree));
        int x;
        for(int i = 1; i <= N; i++)
        {
                fscanf(f,"%d ", &x);
                UpdateValue(BitTree,i,x,N);
        }
        int nr,a,b;
        for(int i = 0; i < M; i++)
        {
                fscanf(f,"%d\n",&nr);
                if(nr == 0) {
                        fscanf(f,"%d %d\n",&a,&b);
                        UpdateValue1(BitTree,a,b,N);
                }
                else if (nr == 1)  {
                        fscanf(f,"%d %d\n",&a,&b);
                        out << getSum(BitTree,b) - getSum(BitTree,a-1) << '\n';
                }
        }

        return 0;
}