Cod sursa(job #3151767)

Utilizator Vladimir_AlbuVladimir Albu Vladimir_Albu Data 22 septembrie 2023 19:43:41
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin;
ofstream fout;

int N;
vector<int> arr(1e5+5, 0);
vector<int> bit(1e5+5, 0);

void update(int i, int val) {
    while(i <= N) {
        bit[i] += val;
        i += (i & (-i));
    }
}

int prefixSum(int i) {
    int sum = 0;
    while(i > 0) {
        sum += bit[i];
        i -= (i & (-i));
    }
    return sum;
}

int rangeSum(int i, int j) {
    return prefixSum(j) - prefixSum(i - 1);
}

int main()
{
    int M;
    fin.open("aib.in");
    fin >> N;
    fin >> M;
    int comanda;
    int a, b;
    for(int i = 1; i <= N; i++) {
        fin >> arr[i];
        update(i, arr[i]);
    }
    fout.open("aib.out");
    for(int i = 1; i <= M; i++) {
        fin >> comanda;
        switch(comanda) {
            case 0: {
                fin >> a >> b;
                update(a, b);
                break;
            }
            case 1: {
                fin >> a >> b;
                fout << rangeSum(a, b) << endl;
                break;
            }
            case 2: {
                int pos = -1;
                fin >> a;
                int st = 1;
                int dr = N;
                while(st <= dr) {
                    int mij = (st + dr) / 2;
                    int sum = prefixSum(mij);
                    if(sum == a) {
                        pos = mij;
                        break;
                    }
                    if(sum > a) {
                        dr = mij - 1;
                    } else {
                        st = mij + 1;
                    }
                }
                fout << pos << endl;
                break;
            }
        }
    }
    fin.close();
    fout.close();
    return 0;
}