Cod sursa(job #1397912)

Utilizator AndyCatrunaCatruna Andy AndyCatruna Data 23 martie 2015 20:30:43
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#define bit(x) (x&(-x))
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n,i,A[100005],j,a,poz,val,k,m,q,b;
void update(int x, int val){
    for(int i=x;i<=n;i+=bit(i)){
        A[i]+=val;
    }
}
int query(int x){
    int sol=0;
    for(int i=x;i>=1;i-=bit(i)){
        sol+=A[i];
    }
    return sol;
}
int cautare(int k){
    int st=1, dr=n,mid=0;
    while(st<=dr){
        mid=(st+dr)/2;
        if(query(mid)==k){
            return mid;
        }
        else{
            if(query(mid)>k){
                dr=mid-1;
            }
            else{
                st=mid+1;
            }
        }
    }
    return -1;


}
int main(){
    fin>>n>>m;
    for(i=1;i<=n;i++){
        fin>>a;
        update(i,a);
    }
    for(i=1;i<=m;i++){
        fin>>q;
        if(q==0){
            fin>>poz>>val;
            update(poz,val);
        }
        if(q==1){
            fin>>a>>b;
            fout<<query(b)-query(a-1)<<"\n";
        }
        if(q==2){
            fin>>k;
            fout<<cautare(k)<<"\n";
        }
    }

    return 0;
}