Cod sursa(job #2392166)

Utilizator AntoniuFicAntoniu Ficard AntoniuFic Data 29 martie 2019 18:57:48
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n, m, array[150000], aib[150000], gp2;

void generate(){
    for (int i = 1; i <= n; ++i) {
        for (int j = i; j <= gp2; j = (j + (j & (-j)))) {
            aib[j] += array[i];
        }
    }
}

void query(int a, int b){
    array[a] += b;
    for (int i = a; i <= gp2; i = (i + (i & (-i)))) {
        aib[i] += b;
    }
}

int request(int a, int b){
    int sum = 0;
    --a;
    for (; b; b = b - (b & (-b))) {
        sum+= aib[b];
    }
    for (; a; a = a - (a & (-a))) {
        sum-= aib[a];
    }
    return sum;
}

int search(int a){
    int sum = 0, pos = 0;
    for (int i = 1; sum < a; i = (i + (i & (-i)))) {
        sum = aib[i];
        pos = i;
    }
    while(sum > a)
        sum -= array[pos--];
    if(sum == a)
        return pos;
    return -1;
}

int main() {
    f>>n>>m;
    for (int i = 1; i <= n; ++i) {
        f>>array[i];
    }
    gp2 = 1;
    while(gp2<n)
        gp2 = (gp2 << 1);
    generate();
//    for (int j = 1; j <= gp2; ++j) {
//        cout<<aib[j]<<' ';
//    }
    for (int i = 0; i < m; ++i) {
        int type, a;
        f>>type>>a;
        switch(type){
            case 0: {
                int b;
                f>>b;
                query(a, b);
                break;
            }
            case 1: {
                int b;
                f>>b;
                cout<<request(a, b)<<"\n";
                break;
            }
            case 2: {
                cout<<search(a)<<"\n";
                break;
            }
            default: break;
        }
    }
    f.close();
    g.close();
    return 0;
}