Cod sursa(job #1020635)

Utilizator RobertSSamoilescu Robert RobertS Data 2 noiembrie 2013 13:51:22
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <fstream>
using namespace std;

#define zeros(x) ( (x ^ (x - 1)) & x )


int n, m;
int AIB[1000], V[1000];

void Add(int x, int quantity)
{
    int i;

    for (i = x; i <= n; i += zeros(i))
        AIB[i] += quantity;
}

int Compute(int x)
{
    int i, ret = 0;

    for (i = x; i > 0; i -= zeros(i))
        ret += AIB[i];
    return ret;
}


int sum(int a, int b){
    int S = 0;

    for(int i=a; i<=b; i++){
        S +=V[i];
    }
    return S;
}



int main()
{

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

    fin >> n >> m;
    for(int i=1; i<=n; i++){
        fin >> V[i];
    }

    for(int i=1; i<=n; i++){
        AIB[i] = sum(i-zeros(i)+1,i);
    }



    int a, b;
    for(int i=1; i<=m; i++){
        int cmd;
        fin >> cmd;

        if(cmd == 0){
            fin>> a >> b;
            Add(a,b);
        }else if(cmd == 1){
            fin>> a >> b;
            fout << Compute(b)-Compute(a-1) << '\n';
        }else{
            fin >> a;
            for(int j=1; j<=n; j++)
                if(Compute(j) == a){
                    fout << j << '\n'; break;
                }
        }

    }


    return 0;
}