Cod sursa(job #751793)

Utilizator memaxMaxim Smith memax Data 26 mai 2012 22:16:05
Problema Arbori indexati binar Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <cmath>
using namespace std;


int main(){
    ifstream cinr ("aib.in");
    ofstream cour ("aib.out");
    int n,m,n1,id,r,a,b;
    cinr >> n1; cinr >> m;
    n=1<<int(log(n1-1)/log(2)+1);
    vector<int> v(2*n,0);
    for(int i=n; i<n+n1; i++) cinr >> v[i];
    for(int i=n-1; i>0; i--) v[i]=v[2*i]+v[2*i+1];
    for(int j=1; j<=m; j++){
            cinr >> id;
            if(id==0){
                      cinr >> a; a+=n-1; 
                      cinr >> b;
                      while(a>0){
                                 v[a]+=b;
                                 a/=2;
                                 }
                      }
            if(id==1){
                      r=0;
                      cinr >> a; a+=n-1;
                      cinr >> b; b+=n-1;
                      while(b>=a){
                                  if(a%2==1){ r+=v[a]; }
                                  if(b%2==0){ r+=v[b]; }
                                  a=(a+1)/2;
                                  b=(b-1)/2;
                                  }
                      cour << r << "\n";
                      }
            if(id==2){
                      cinr >> b; a=1; r=0;
                      while(a<2*n){
                                  if(v[a]+r==b){ r+=v[a]; break; }
                                  if(v[a]+r>b) { a*=2; }
                                  else         { r+=v[a]; a++; }
                                  }
                      while(a<n) a=2*a+1;
                      if(r==b) { cour << a-n+1 << "\n"; }
                      else     { cour << -1 << "\n"; }
                      }
            }
    
    //for(int i=0; i<2*n; i++) cout << v[i] << " ";
    cinr.close(); cour.close();
    //cin.ignore(1);
    return 0;
    }