Cod sursa(job #3282118)

Utilizator stefan_dore_Stefan Dore stefan_dore_ Data 4 martie 2025 15:58:32
Problema Arbori indexati binar Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include <iostream>
#include <fstream>
#include <cmath>
#define ll long long
using namespace std;

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

const ll NMAX = 100000,
          SQMAX = 1000;
ll N, M, nrB, BLOCK_SIZE, V[NMAX+1], SB[NMAX+1];

void citire() {
    f >> N >> M;
    for (ll i=0; i<N; i++)
        f >> V[i];
}

void construire() {
    nrB = -1;
    //
    BLOCK_SIZE = (ll) sqrt(N);
    //
    for (ll i=0; i<N; i++) {
        if (i % BLOCK_SIZE == 0)
            nrB++;
        SB[nrB] += V[i];
    }
}

void update(ll poz, ll val) {
    ll blockNumber = poz / BLOCK_SIZE;
    SB[blockNumber] += val;
    V[poz] += val;
}

ll querry1(ll st, ll dr) {
    ll sum = 0;
    //
    while(st <= dr && st % BLOCK_SIZE != 0)
        sum += V[st++];
    //
    while(st + BLOCK_SIZE - 1 <= dr) {
        sum += SB[st/BLOCK_SIZE];
        st += BLOCK_SIZE;
    }
    //
    while(st <= dr)
        sum += V[st++];
    //
    return sum;
}

ll querry2(ll targetSum) {
    ll sum = 0, blockNumber = 0, poz;
    //
    while (sum + SB[blockNumber] <= targetSum && blockNumber <= nrB)
        sum += SB[blockNumber++];
    //
    poz = blockNumber * BLOCK_SIZE;
    //
    while (sum + V[poz] <= targetSum && poz < N)
        sum += V[poz++];
    //
    if (sum != targetSum)
        return -1;
    return poz;
}

int main()
{
    citire();
    construire();
    ll op, a, b;
    for (int i=1; i<=M; i++) {
        f >> op;
        switch(op) {
            case 0:
                f >> a >> b;
                update(a-1, b);
                break;
            case 1:
                f >> a >> b;
                g << querry1(a-1, b-1) << '\n';
                break;
            case 2:
                f >> a;
                g << querry2(a) << '\n';
                break;
        }
    }
    f.close();
    g.close();
    return 0;
}