Cod sursa(job #1420796)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 18 aprilie 2015 23:20:52
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>

using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");

struct node{
    int value;
    node *left;
    node *right;
};

int N , Q ;
void Build(node *&Tree,int p,int u){
    if(p==u){
        fin>> Tree -> value;
        return;
    }

    Tree -> left = new node;
    Tree -> right = new node;
    int mid=(p + u) >> 1;

    Build(Tree -> left,p,mid);
    Build(Tree -> right,mid+1,u);

    Tree -> value = Tree -> left -> value + Tree -> right -> value;
}
void Update(node *&Tree,int p,int u,int pos,int val){
    if(p==u){
        Tree -> value -= val;
        return;
    }

    int mid = (p + u) >> 1;

    if(pos <= mid)
        Update(Tree -> left,p,mid,pos,val);
    else
        Update(Tree -> right,mid+1,u,pos,val);

    Tree -> value = Tree -> left -> value + Tree -> right -> value;
}
int Query(node *&Tree,int p,int u,int lb,int ub){
    if(p >= lb && u <= ub){
        return Tree -> value;
    }

    int mid = (p + u) >> 1;

    int Value = 0;

    if(mid >= lb)
        Value += Query(Tree -> left,p,mid,lb,ub);

    if(mid + 1 <= ub)
        Value += Query(Tree -> right,mid+1,u,lb,ub);

    return Value;
}
int main(){
    fin >> N >> Q ;
    node *Tree= new node;
    Build(Tree,1,N);
    while(Q--){
        int Task;
        fin>> Task;
        if(Task == 1){
            int Lower_Bound, Upper_Bound;
            fin >> Lower_Bound >> Upper_Bound;
            fout << Query(Tree,1,N,Lower_Bound,Upper_Bound) << "\n";
        }
        else{
            int Position, New_Value;
            fin >> Position >> New_Value;
            Update(Tree,1,N,Position,New_Value);
        }
    }

    return 0;
}