Cod sursa(job #2571543)

Utilizator berindeiChesa Matei berindei Data 5 martie 2020 02:48:29
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
using namespace std;

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

int const MAXN = 1e5+10;

int aib[MAXN];
int N;

int read(int poz){
    int sum = 0;
    while (poz>0){
        sum+=aib[poz];
        poz-= (poz & -poz);
    }
    return sum;
}

void add(int poz, int val){
    while (poz<=N){
        aib[poz]+=val;
        poz+= (poz & -poz);
    }
}

int cauta(int target){
    int ans=0;
    int sum=0;
    for (int bitmask=(1<<20); bitmask!=0; bitmask>>=1){
        if (ans+bitmask<N && sum+aib[ans+bitmask]<target){
            ans+=bitmask;
            sum+=aib[ans];
        }
    }
    ans++;
    return (read(ans)==target) ? ans : -1;
}

int main(){
    int m;
    in >> N >> m;
    for (int i=1; i<=N; ++i){
        int nr;
        in >> nr;
        add(i, nr);
    }
    for (int i=1; i<=m; ++i){
        int caz;
        in >> caz;
        if(caz==0){
            int a, b;
            in >> a >> b;
            add(a, b);
        }
        else if (caz==1){
            int a, b;
            in >> a >> b;
            out << read(b)-read(a-1) << '\n';
        }
        else{
            int a;
            in >> a;
            out << cauta(a) << '\n';
        }
    }
}