Cod sursa(job #853538)

Utilizator yamahaFMI Maria Stoica yamaha Data 12 ianuarie 2013 12:31:23
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 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 search(int sum)
{
    int mj, st = 1, dr = N;
    while(st < dr){
        mj = (st + dr) / 2;
        if(suma(mj) < sum) st = mj + 1; 
        else dr = mj;
    }
    return suma(st) == sum ? st : -1;
}

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;
            fout << search(sum) << "\n";
        }//end of if cod == 2
        
    }//end of for i = 1 -> M
    
    return 0;
}