Cod sursa(job #3248303)

Utilizator motocelMotocescu Laura motocel Data 11 octombrie 2024 15:13:16
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;
int n;
int bit[100005];
int a[100005];
void update(int i, int val)
{
    while(i <= n){
        bit[i] += val;
        i += (i & -i);
    }
}
int query(int i)
{
    int sum = 0;
    while(i > 0){
        sum += bit[i];
        i -= (i & -i);
    }
    return sum;
}
int main()
{
    int m;
    cin >> n >> m;
    int cerinta;
    for(int i = 1; i <= n; i ++){
        cin >> a[i];
        update(i, a[i]);
    }
    int x, y;
    for(int i = 1; i <= m; i ++){
        cin >> cerinta;
        if(cerinta == 0){
            cin >> x >> y;
            update(x, y);
            a[x] += y;
        }
        else if(cerinta == 1){
            cin >> x >> y;
            cout << query(y) - query(x - 1) << "\n";
        }
        else if(cerinta == 2){
            cin >> x;
            int st, dr;
            st = 1;
            dr = n;
            int ok = 0;
            while(dr > st){
                int mid = (dr + st) / 2;
                int rasp = query(mid);
                if(rasp >= x){
                    dr = mid;
                }
                else{
                    st = mid + 1;
                }
            }
            if(query(dr) == x){
                cout << dr << "\n";
            }
            else{
                cout << -1;
            }
        }
    }
    return 0;
}