Cod sursa(job #1752156)

Utilizator CalarisPredut Denis Stefanita Calaris Data 2 septembrie 2016 20:51:02
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <iostream>
#include <fstream>
#include <math.h>
#define MAX 15001

using namespace std;

int A[MAX];
long long Tree[30000];

long long  createTree(int arr[],long long Tree[],int i,int x,int y);

void updateValue(long long Tree[],int pos, int val,int x, int y,int i);

long long getValue(long long Tree[],int posx,int posy, int x, int y, int i);

int main()
{
    ifstream f("datorii.in");
    ofstream g("datorii.out");
    int N,M,i,x,y;
    bool choice;

    f>>N>>M;
    for(i=0;i<N;++i)
        {
            f>>A[i];
            Tree[i] = 0;
        }

    createTree(A,Tree,0,0,N-1);

    for(i=0;i<M;++i)
        {
        f>>choice>>x>>y;
        --x;
        if(!choice)
            {
                updateValue(Tree,x,y,0,N-1,0);
            }
        else
            {
            --y;
            g<<getValue(Tree,x,y,0,N-1,0)<<"\n";
            }
        }


    return 0;
}

// [x][y] = [x
long long createTree(int arr[],long long Tree[],int i,int x,int y)
{
     if(x == y)
        {
        Tree[i] = arr[x];
        return Tree[i];
        }
    int mid = (x+y)/2;

    Tree[i] = createTree(arr,Tree,2*i+1,x,mid) + createTree(arr,Tree,2*i+2,mid+1,y);

    return Tree[i];
}

void updateValue(long long Tree[],int pos, int val,int x, int y,int i)
{
    if(pos<x || pos > y) return;

    Tree[i]-=val;

    int mid = (x+y)/2;


    if(x!=y)
    {
    updateValue(Tree,pos,val,x,mid,2*i+1);
    updateValue(Tree,pos,val,mid+1,y,2*i+2);
    }
}

long long getValue(long long Tree[],int posx,int posy, int x, int y, int i)
{
     if(posx <= x && posy >= y)
        {
         return Tree[i];
        }
     if(posx>y || posy < x) return 0;

    int mid = (x+y)/2;
    return getValue(Tree,posx,posy,x,mid,2*i+1) + getValue(Tree,posx,posy,mid+1,y,2*i+2);
}