Cod sursa(job #3247221)

Utilizator Iustin_Mircea2010Iustin Mircea Iustin_Mircea2010 Data 6 octombrie 2024 13:21:25
Problema Arbori indexati binar Scor 100
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>
using namespace std;
#define int long long
int aib[100005];
int v[100005];
int n, m;
void update(int i, int val){
    while(i <= n){
        aib[i] += val;
        i += i&-i;
    }
}
int query(int val){
    int ret = 0;
    while(val){
        ret += aib[val];
        val -= val&-val;
    }
    return ret;
}
signed main()
{
    ifstream cin("aib.in");
    ofstream cout("aib.out");
    cin >> n >> m;
    for(int i = 1; i <= n; i++){
        cin >> v[i];
        update(i, v[i]);
    }
    for(int i = 1; i <= m; i++){
        int cer, x, y;
        cin >> cer;
        if(cer == 0){
            cin >> x >> y;
            update(x, y);
            v[x] += y;
        }
        else if(cer == 1){
            cin >> x >> y;
            cout << query(y) - query(x-1) << '\n';
        }
        else{
            cin >> x;
            int l = 1, dr = n;
            while(dr > l){
                int mid = (l+dr)/2;
                int g = query(mid);
                if(g >= x)
                    dr = mid;
                else
                    l = mid + 1;
            }
            if(query(dr) == x)
                cout << dr << '\n';
            else
                cout << -1 << '\n';
        }
    }
    return 0;
}