Cod sursa(job #3364983)

Utilizator daviddxmqStan David Andrei daviddxmq Data 14 septembrie 2026 22:20:42
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.12 kb
#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

const int MAXN = 100005;

int n, m;
int arr[MAXN];
int sumInt[1005];
int lenGrup;

void adauga(int a, int b) {
    arr[a] += b;
    int interval = (a - 1) / lenGrup;
    sumInt[interval] += b;
}

int query(int a, int b) {
    int suma = 0;
    int intervalA = (a - 1) / lenGrup;
    int intervalB = (b - 1) / lenGrup;

    if (intervalA == intervalB) {
        for (int i = a; i <= b; ++i)
            suma += arr[i];
        return suma;
    }

    int endGrupA = (intervalA + 1) * lenGrup;
    int startGrupB = intervalB * lenGrup + 1;

    for (int i = a; i <= endGrupA; ++i)
        suma += arr[i];

    for (int i = intervalA + 1; i < intervalB; ++i)
        suma += sumInt[i];

    for (int i = startGrupB; i <= b; ++i)
        suma += arr[i];

    return suma;
}

int cauta(int a) {
    int sumaCurenta = 0;
    int numGrupuri = (n - 1) / lenGrup;

    for (int i = 0; i <= numGrupuri; ++i) {
        if (sumaCurenta + sumInt[i] >= a) {
            int st = i * lenGrup + 1;
            int dr = min(n, (i + 1) * lenGrup);

            for (int j = st; j <= dr; ++j) {
                sumaCurenta += arr[j];
                if (sumaCurenta == a)
                    return j;
            }
            return -1;
        }
        sumaCurenta += sumInt[i];
    }

    return -1;
}

int main() {
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);

    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n >> m;
    lenGrup = sqrt(n);

    for (int i = 1; i <= n; ++i) {
        cin >> arr[i];
        int interval = (i - 1) / lenGrup;
        sumInt[interval] += arr[i];
    }

    for (int i = 1; i <= m; ++i) {
        int op, a, b;
        cin >> op;
        if (op == 0) {
            cin >> a >> b;
            adauga(a, b);
        }
        else if (op == 1) {
            cin >> a >> b;
            cout << query(a, b) << "\n";
        }
        else {
            cin >> a;
            cout << cauta(a) << "\n";
        }
    }

    return 0;
}