Cod sursa(job #2720749)

Utilizator MariusblockMoga Marius-Ioan Mariusblock Data 11 martie 2021 11:28:42
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include<bits/stdc++.h>

using namespace std;

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

long long aib[200005], poz;
int n,m;

void add_to_aib(long long poz, long long val){
    long long i;
    for(i = poz; i <= n ;i += (i&(-i))){
        aib[i] += val;
    }
}

long long sum( long long poz){
    long long S=0,i;
    for(i = poz; i >= 1; i-= (i&(-i))){
        S+= aib[i];
    }
    return S;
}

long long query(long long a, long long b){
    return (sum(b)-sum(a-1));
}

void cautare_binara(long long val, int left, int right){
    if(left > right){
        return;
    }
    int mid = left + (right-left)/2;
    int valmid = sum(mid);
    if(valmid == val){
        poz = mid;
        cautare_binara(val, left, mid-1);
    }else{
        if(val < valmid){
            cautare_binara(val, left, mid-1);
        }else{
            cautare_binara(val, mid+1, right);
        }
    }
}

int main(){
    int i,aux,p;
    long long a,b;
    fin>>n>>m;
    for(i = 1; i <= n; i++){
        fin>>aux;
        add_to_aib(i,aux);
    }
    for(i = 1; i <= m; i++){
        fin>>p;
        if(p == 0){
            fin>>a>>b;
            add_to_aib(a,b);
        }else if(p == 1){
            fin>>a>>b;
            fout<<query(a,b)<<'\n';
        }else if(p == 2){
            fin>>a;
            poz = -1;
            cautare_binara(a,1,n);
            fout<<poz<<'\n';
        }
    }
	return 0;
}