Cod sursa(job #2064921)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 13 noiembrie 2017 00:09:08
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;

int n, t;
int aib[100005];

void update(int idx, int val)
{
    while(idx <= n){
        aib[idx] += val;
        idx += (idx & (-idx));
    }
}

int read(int idx)
{
    int sum = 0;
    while(idx){
        sum += aib[idx];
        idx -= (idx & (-idx));
    }
    return sum;
}

int src(int x)
{
    int m, lo = 1, hi = n, ans = -1;
    for (m = (lo+hi)/2; lo <= hi; m = (lo+hi)/2){
        int aux = read(m);
        if(aux >= x){
            if(aux == x)
                ans = m;
            hi = m-1;
        }else lo = m+1;
    }
    return ans;
}

int main()
{
    ifstream fin ("aib.in");
    ofstream fout ("aib.out");
    fin >> n >> t;
    for (int i = 1; i <= n; ++i){
        int x;
        fin >> x;
        update(i, x);
    }
    while(t--){
        int c, x, y;
        fin >> c;
        switch(c){
            case 0:
                fin >> x >> y;
                update(x, y);
                break;
            case 1:
                fin >> x >> y;
                fout << read(y)-read(x-1) << "\n";
                break;
            case 2:
                fin >> x;
                fout << src(x) << "\n";
                break;
        }
    }
    fin.close();
    fout.close();
    return 0;
}