Cod sursa(job #1944234)

Utilizator RaZxKiDDavid Razvan RaZxKiD Data 29 martie 2017 00:24:55
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>

#define zeros(x) ((-x)&(x))

using namespace std;

ifstream in("aib.in");
ofstream out("aib.out");

int n,m;
int AIB[100005];

void add(int x, int val){
    for(int i=x;i<=n;i+=zeros(i)){
        AIB[i]+=val;
    }
}
int sum(int x){
    int s=0;
    for(int i=x;i>=1;i-=zeros(i)){
        s+=AIB[i];
    }
    return s;
}
int sum_interval(int x, int y){
    return sum(y)-sum(x-1);
}

int binary_s(int x){
    int st=1,dr=n,mid,sol=-1;
    while(st<=dr){
        mid=(st+dr)/2;
        if(sum(mid)>=x){
            sol=mid;
            dr=mid-1;
        }
        else st=mid+1;
    }
    return sol;
}

void read(){
    int x;
    in>>n>>m;
    for(int i=1;i<=n;i++){
        in>>x;
        add(i,x);
    }
}
void solve(){
    int op,x,y;
    for(int i=1;i<=m;i++){
        in>>op;
        if(op==0){
            in>>x>>y;
            add(x,y);
        }
        else if(op==1){
            in>>x>>y;
            out<<sum_interval(x,y)<<"\n";
        }
        else if(op==2){
            in>>x;
            out<<binary_s(x)<<"\n";
        }
    }
}
int main(){
    read();
    solve();
    return 0;
}