Cod sursa(job #2917525)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 5 august 2022 15:28:35
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <bits/stdc++.h>
#pragma GCC optimize ("Ofast")

using namespace std;

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

const int MAX_N = 100005;
int n, input[MAX_N];

struct FENWICK{
    int aib[2 * MAX_N];

    inline int lsb(int k){
        return (k & (-k));
    }

    inline void build(){
        for(int i=1; i<=n; i++){
            aib[i] += input[i];
            if(i + lsb(i) <= n)
                aib[i + lsb(i)] += aib[i];
        }
    }

    inline void update(int nod, int val){
        while(nod <= n){
            aib[nod] += val;
            nod += lsb(nod);
        }
    }

    inline int prefix(int nod){
        int answer = 0;
        while(nod > 0){
            answer += aib[nod];
            nod -= lsb(nod);
        }
        return answer;
    }
} tree;

const int MAX_Q = 100005;
int qcnt, type, a, b;

int main (){
    ios_base::sync_with_stdio(false);
    fin.tie(nullptr), fout.tie(nullptr);

    fin>>n>>qcnt;
    for(int i=1; i<=n; i++)
        fin>>input[i];
    tree.build();

    while(qcnt--){
        fin>>type;
        if(type == 0){ ///update
            fin>>a>>b;
            tree.update(a, b);
        }else if(type == 1){ ///suma pe interval
            fin>>a>>b;
            fout<<tree.prefix(b) - tree.prefix(a-1)<<"\n";
        }else{ ///cautare binara
            fin>>a;
            int st=1, md, dr=n, sum, save=-1;
            while(st <= dr){
                md = st + ((dr - st) >> 1);
                sum = tree.prefix(md);

                if(sum == a){
                    save = md;
                    break;
                }

                if(sum < a) st = md + 1;
                if(sum > a) dr = md - 1;
            }
            fout<<save<<"\n";
        }
    }
    return 0;
}