Cod sursa(job #1185553)

Utilizator buzu.tudor67Tudor Buzu buzu.tudor67 Data 15 mai 2014 23:34:20
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<fstream>
using namespace std;
ifstream fi("aib.in");
ofstream fo("aib.out");

const int maxn = 100005;

int i,n,m,x,y,oper;
int a[maxn];

int lsb(int x){
    return (x&(-x));
}

void update(int poz,int x){
     int i;
     for(i=poz;i<=n;i+=lsb(i)) 
         a[i]+=x;
}

int query(int poz){
    int i,s=0;
    for(i=poz;i>0;i-=lsb(i)) 
        s+=a[i];
    return s;
}

int caut_binar(int x){
    int i,step;
    
    for(step=1; step<n; step<<=1);
    
    for(i=0; step>0; step>>=1)
       if(i+step<=n){
                     if(x>=a[i+step]){
                                      i+=step; x-=a[i];
                                      if(!x) return i; 
                                     }
                    }
    return (-1);
}

int main(){
    fi>>n>>m;
    for(i=1;i<=n;i++){ fi>>x; update(i,x); }
    
    for(;m>0;m--){
                  fi>>oper;
                  if(oper==0){
                              fi>>x>>y;
                              update(x,y);
                             } 
                  else if(oper==1){
                                   fi>>x>>y;
                                   fo<<query(y)-query(x-1)<<"\n";
                                  }  
                  else if(oper==2){
                                   fi>>x;
                                   fo<<caut_binar(x)<<"\n";
                                  } 
                 }
    
    fi.close();
    fo.close();
    return 0;
}