Cod sursa(job #2393686)

Utilizator Bulboaca_EugenBulboaca Alexandru Eugen Bulboaca_Eugen Data 31 martie 2019 21:10:04
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>
#define zeros(x)  (x & (-x))
using namespace std;
const int MAXN =  1e5 + 15;
int aib[MAXN];
void update(int poz, int n, int val){
    for(int i = poz; i <= n; i += zeros(i))
        aib[i] += val;
}
int query(int y){
    int s1 = 0;
    for(int i = y; i >= 1; i -= zeros(i))
        s1 += aib[i];
    return s1;
}
int findd(int s, int n){
    int current = 0;
    for(int power = 29; power >= 0; --power){
        if((1 << power) + current < n and query((1 << power) + current) < s)
            current += (1 << power);
    }
    current ++;
    if(query(current) == s) return current;
    return -1;
}
ifstream fin("aib.in");
ofstream fout("aib.out");
int main(){
    int n, m, val;
    fin >> n >> m;
    for(int i = 1; i <= n; ++i){
        fin >> val;
        update(i, n, val);
    }
    for(int i = 1; i <= m; ++i){
        int type , a, b;
        fin >> type >> a;
        if(type == 0){
            fin >> b;
            update(a, n, b);
        }
        else if(type == 1){
            fin >> b;
            fout << query(b) - query(a - 1) << '\n';
        }
        else {
            fout << findd(a, n) << '\n';
        }
    }
    return 0;
}