Cod sursa(job #766271)

Utilizator memaxMaxim Smith memax Data 10 iulie 2012 20:09:42
Problema Arbori indexati binar Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;

int main(){
    ifstream cinr ("aib.in");
    ofstream cour ("aib.out");
    int n, n1, k,s,l,r,q,m;
    cinr >> n1;
    cinr >> m;
    n=1<<int(log(n1-1)/log(2)+1);
    vector<int> v(n*2,0);
    for(int i=0; i<n1; i++){
            cinr >> v[i+n];
            }
    for(int i=n-1; i>0; i--){
            v[i]=v[2*i]+v[2*i+1];
            }
for(int i=1; i<=m; i++){
 cinr >> q;
 if(q==2){          
    cinr >> k;
    s=1;
    while(s<n){
                   if(v[2*s]==k){ s*=2; break; }
                   if(v[2*s+1]==k){ s=2*s+1; break; }
                   if(v[2*s]<k){
                                k-=v[2*s];
                                s=2*s+1;
                                }
                   else         { s*=2; } 
                   }
    if(v[s]!=k){ cour << "-1\n"; }
    else{
    while(s<n){ s=2*s+1; }
    cour << s-n+1 << "\n"; }
 }
 if(q==1){
    cinr >> l; cinr >> r;
    l+=n-1; r+=n-1; s=0;
    while(l<=r){
               if(l%2==1) s+=v[l]; 
               if(r%2==0) s+=v[r];
               l=(l+1)/2; r=(r-1)/2;
               }
    cour << s << "\n";
 }
 if(q==0){ 
    cinr >> l; cinr >> r;
    l+=n-1;
    while(l>0){
               v[l]+=r;
               l/=2;
               }
 }
}
    cour.close();
    cinr.close(); 
    return 0;
    }