Cod sursa(job #3267156)

Utilizator ioanabaduIoana Badu ioanabadu Data 11 ianuarie 2025 10:05:35
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in("aib.in");
ofstream out("aib.out");

int n, queries;
int arr[100005], aib[100005];

void update (int x, int value){
    for (int i=x; i<=n; i+=(i&-i)){
        aib[i] += value;
    }
}

int query (int x){
    int rez = 0;
    for (int i=x; i>0; i-=(i&-i)){
        rez += aib[i];
    }
    return rez;
}

long long special (long long sum){
    long long mySum = 0, idx = 1;
    
    while (1){
        while (mySum + aib[idx+(idx&-idx)] <= sum){
            idx += (idx&-idx);
            if (idx == n)
                break;
            if (idx > n)
                return -1;
        }
        mySum += aib[idx];
        if (mySum == sum)
            return idx;
        else if (mySum > sum)
            return -1;
        
        idx++;
    }
    return -1;
}

int main (){
    in >> n >> queries;

    for (int i=1; i<=n; ++i){
        in >> arr[i];
        update(i, arr[i]);
    }

    int op, x, y;
    long long sum;
    for (int i=1; i<=queries; ++i){
        in >> op;
        if (op == 0){
            in >> x >> y;
            update(x, y);
        }
        if (op == 1){
            in >> x >> y;
            out << (query(y) - query(x-1)) << '\n';
        }
        if (op == 2){
            in >> sum;
            out << special(sum) << '\n';
        }
    }

    return 0;
}