Cod sursa(job #3319822)

Utilizator StefanIancuIancu Stefan StefanIancu Data 3 noiembrie 2025 12:34:54
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

vector<int> v;
int n, m;

int lsb (int x){
    return (x & -x);
}
void update(int pos, int val){
    for(int i = pos; i <= n; i+= lsb(i)){
        v[i] += val;
        //cout << i << " " << lsb(i) << endl;
        //if(i ==0 )
        //    break;
    }
}
int query(int pos){
    int s = 0;
    for(int i = pos; i > 0; i-= lsb(i))
        s+= v[i];
    return s;
}
int main()
{
    ifstream fin("aib.in");
    ofstream fout("aib.out");

    fin >> n >> m;
    v.resize(n + 1);
    for(int i = 1; i <= n ; i++){
        int nr;
        fin>>nr;
        update(i, nr);
    }
    for(int i = 0; i < m; i++){
        int cer;
        fin >> cer;
        if(cer == 0){
            int pos, val;
             fin >> pos >> val;
              update(pos, val);
        }
        if(cer == 1){
            int pos1, pos2;
            fin >>pos1 >> pos2;
            fout << query(pos2) - query (pos1 - 1) << '\n';
        }
        if(cer == 2){
            int x;
            fin >> x;
            int ans = 0;
            int sum = 0;
            for(int pas = (1 << 17); pas > 0; pas /= 2){
                if(ans + pas <= n && sum + v[ans + pas] < x){
                    ans += pas;
                    sum += v[ans];
                }
            }
            fout << ans + 1<< '\n';

            /*for(int i = 1; i<= n; i++)
                if(query(i)== x){
                    fout << i << endl;
                    break;
            }*/
        }
    }

    return 0;
}