Cod sursa(job #853501)

Utilizator yamahaFMI Maria Stoica yamaha Data 12 ianuarie 2013 12:23:38
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include<fstream>
#include<cmath>
#define zeros(x) ( (x ^ (x - 1)) & x )
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int aib[100005], N, M;

void add(int index, int val){
    int i;
    /*
    int poz = 0;
    while(index <= N){
        aib[index] += val;
        while( (index & (int)pow((double)2,poz)) == 0 ) ++poz;
        index += (int)pow((double)2,poz);
        ++poz;
    }//end of while
    */
    for (i = index; i <= N; i += zeros(i))
        aib[i] += val;
          
    //fout << "aib: ";
    //for(i = 1; i <= N; ++i) fout << aib[i] << ", ";
    //fout << "\n";

}//end of add(index, val)


int suma(int x){ // calculeaza suma de la 1 la x (indecsi)
    int i, sol = 0;
    for (i = x; i > 0; i -= zeros(i))
        sol += aib[i];
    return sol;
}//end of suma


int main (){
    
    
    fin >> N >> M; // N elemente, M operatii
    
    int i,j,x;
    for(i = 1; i <= N; ++i){
        fin >> x; // am bagat arborele
        add(i,x);
    }
    
    int cod, sum, a, b, index, val, temp;
    //int poz = 0; // pozitia celui mai nesemnificativ bit cu valoarea 1
    
    for(i = 1; i <= M; ++i){
        fin >> cod;
        if(cod == 0){
            fin >> index >> val;
            add(index, val);
        }//end of if cod == 0
        
        else if(cod == 1){
            fin >> a >> b;
            fout << (suma(b) - suma(a-1)) << "\n";
        }//end of if cod == 1
        
        else if(cod == 2){
            fin >> sum;
            j = 1;
            temp = suma(j++);
            while(temp != sum){
                temp = suma(j++);
            }
            fout << j-1 << "\n";
        }//end of if cod == 2
        
    }//end of for i = 1 -> M
    
    return 0;
}