Cod sursa(job #3247801)

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

using namespace std;
//ifstream cin("aib.in");
//ofstream cout("aib.out");
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 > 1){
                int mid = (dr + st) / 2;
                int rasp = query(mid);
                if(x == rasp){
                    cout << mid << "\n";
                    ok = 1;
                    break;
                }
                else if(rasp > x){
                    dr = mid;
                }
                else{
                    st = mid + 1;
                }
            }
            if(ok == 0){
                cout << -1;
            }
        }
    }
    return 0;
}