Cod sursa(job #929258)

Utilizator memaxMaxim Smith memax Data 26 martie 2013 22:18:08
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;

void add(int a, int b, int c[]);
int getSum(int a, int b, int c[]);
int position(int a, int c[], int n);


int main(){
    int n, n1,m;
    ifstream cinr("aib.in");
    cinr >> n1 >> m;
    n=1<<int(log(n1-1)/log(2)+1);
    int v[2*n];
    for(int i=0; i<n1; i++) cinr >> v[n+i];
    for(int i=n+n1; i<2*n; i++) v[i]=0;
    
    for(int i=n-1; i>0; i--) v[i]=v[2*i]+v[2*i+1];
    
    ofstream cour("aib.out");
    for(int i=0; i<m; i++){
            int x,y,z; cinr >> x >> y;
            if(x==0){
                     cinr >> z;
                     add(z, y+n-1, v);
                     }
            if(x==1){
                     cinr >> z;
                     cour << getSum(y+n-1, z+n-1, v) << "\n";
                     }
            if(x==2){
                     cour << position(y, v, n) << "\n";
                     }
            }
    cinr.close(); cour.close();
    }
    
void add(int a, int b, int c[]){
     while(b>0){
                c[b]+=a;
                b/=2;
                }
     }
    
int getSum(int a, int b, int c[]){
    int sum=0;
    while(a<=b){
                if(a%2==1) sum+=c[a];
                if(b%2==0) sum+=c[b];
                a=(a+1)/2;
                b=(b-1)/2;
                }
    return sum;
    }
    
int position(int a, int c[], int n){
    int p=1;
    while(p<n){
              if(c[p]==a) break;
              if(c[2*p]<a){
                           a-=c[2*p];
                           p=2*p+1;
                           }
              else         p*=2;
              }
    if(c[p]>a || c[p]<a) return(-1);
    while(p<n) p=2*p+1; return p-n+1;
    }