Cod sursa(job #1210857)

Utilizator azkabancont-vechi azkaban Data 21 iulie 2014 14:16:07
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream>
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");

int i,n,m,x,y,op,a[1000013];

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

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

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

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

int main()
{
 cin>>n>>m;
 for(i=1;i<=n;i++){ 
                   cin>>x; 
                   update(i,x); 
                  }
    while(m--){
               cin>>op;
               if(op==0){
                         cin>>x>>y;
                         update(x,y);
                         } 
               if(op==1){
                         cin>>x>>y;
                         cout<<query(y)-query(x-1)<<"\n";
                         }  
               if(op==2){
                        cin>>x;
                        cout<<cauta(x)<<"\n";
                        } 
               }
    return 0;
}