Cod sursa(job #1329948)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 30 ianuarie 2015 01:48:16
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#define bit(x) ((x ^ (x - 1) & x))
using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");
int n,m,aib[100002],op;
void add(int x,int y){
    for(int i=x;i<=n;i+=bit(i))
        aib[i]+=y;
}
int suma(int x){
    int s=0;
    for(int i=x;i>0;i-=bit(i))
        s+=aib[i];
    return s;
}
int cauta(int x){
    int p=1,u=n,mid,val;
    while(p<=u){
        mid=(p+u)>>1;
        val=suma(mid);
        if(val==x)
            return mid;
        else{
            if(val>x)
                u=mid-1;
            else
                p=mid+1;
        }
    }
    return -1;
}
int main(){
    fin>>n>>m;
    for(int i=1;i<=n;i++){
        int x;
        fin>>x;
        add(i,x);
    }
    while(m--){
        fin>>op;
        if(op==0){
            int a,b;
            fin>>a>>b;
            add(a,b);
        }
        if(op==1){
            int a,b;
            fin>>a>>b;
            fout<<suma(b)-suma(a-1)<<"\n";
        }
        if(op==2){
            int a;
            fin>>a;
            fout<<cauta(a)<<"\n";
        }
    }
    fin.close();fout.close();
    return 0;
}