Cod sursa(job #3231531)

Utilizator BoggiGurau Bogdan Boggi Data 26 mai 2024 22:54:06
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;

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

#define VI vector<int>

VI sir, aib;
int N, M;

void update(int idx, int val) {
    for (int i = idx; i <= N; i += i & -i) {
        aib[i] += val;
    }
}

int sum(int idx) {
    int suma = 0;
    for (int i = idx; i >= 1; i -= i & -i) {
        suma += aib[i];
    }
    return suma;
}

int cautare(int val) {
    int i, step;
    
    for ( step = 1; step < N; step <<= 1 ); 
    
    for( i = 0; step; step >>= 1 )
    {
         if( i + step <= N)
         {
            if( val >= aib[i+step] ) 
            {
                i += step, val -= aib[i];
                if ( !val ) return i;
            }
         }
    }
    
    return -1;
}

int main() {
    fin >> N >> M;
    sir = aib = VI(N + 1, 0);
    for (int i = 1; i <= N; ++i) {
        fin >> sir[i];
        update(i, sir[i]);
    }

    for (int i = 0; i < M; ++i) {
        int op;
        fin >> op;
        if (op < 2) {
            int idx, val;
            fin >> idx >> val;
            if (op == 0) {
                update(idx, val);
            } else {
                fout << sum(val) - sum(idx - 1) << '\n';
            }
        } else {
            int val;
            fin >> val;
            fout << cautare(val) << '\n';
        }
    }
}