Cod sursa(job #3183359)

Utilizator andreea_chivuAndreea Chivu andreea_chivu Data 11 decembrie 2023 16:45:16
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>

using namespace std;

const int NMAX = 100001;
const int L = 16;
int aib[NMAX];

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

long long suma(int n, int poz){
    long long suma = 0;
    while(poz != 0){
        suma += aib[poz];
        poz-=(poz & (-poz));
    }
    return suma;
}

int caut_bin(int n, long long val){
    int x = 0;
    int pas = 1 << L;
    unsigned int copie_val = val;
    while(pas > 0){
        if(x + pas <= n && aib[x + pas] < val){
            val-=aib[x + pas];
            x += pas;
        }
        pas /= 2;
    }
    if(suma(n, x + 1) == copie_val)
        return x + 1;
    return -1;
}

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

    int n, m;
    fin >> n >> m;

    for(int i = 1; i <= n; i++){
        int val;
        fin >> val;
        adauga(n, i, val);
    }

    for(int i = 1; i <= m; i++){
        int t;
        fin >> t;
        if(t == 0){
            int a, b;
            fin >> a >> b;
            adauga(n, a, b);
        }else if(t == 1){
            int a, b;
            fin >> a >> b;
            fout << suma(n, b) - suma(n, a-1) << "\n";
        }else{
            unsigned a;
            fin >> a;
            fout << caut_bin(n, a) << "\n";
        }
    }


    fin.close();
    fout.close();
    return 0;
}