Cod sursa(job #1818615)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 29 noiembrie 2016 15:22:37
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>

#define NMax 100001
#define zero(x) ((x) & (-x))
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");

int n,m,p,poz,val,x,y;
int TR[NMax];

void add(int nr, int x){
    for(int i = nr; i <= n; i += zero(i))
        TR[i] += x;
}
int sum(int poz){
    int s = 0;
    for(int i = poz; i >= 1; i -= zero(i))
        s += TR[i];
    return s;
}
int cautbin(int lo, int hi,int k){
    int mid;
    while(lo <= hi){
        mid = (lo + hi) / 2;
        int s = sum(mid);
        if(s == k){
            return mid;
        }else
        if(s < k){
            lo = mid + 1;
        }else
        if(s > k){
            hi = mid - 1;
        }
    }
    return 0;
}
int main()
{
    f >> n >> m;
    for(int i = 1; i <= n; ++i){
        f >> x;
        add(i,x);
    }
    for(int i = 1; i <= m; ++i){
        f >> p;
        if(p == 0){
            f >> poz >> val;
            add(poz,val);
        }
        if(p == 1){
            f >> x >> y;
            g << sum(y) - sum(x - 1) << '\n';
        }
        if(p == 2){
            f >> x;
            int e = cautbin(1,n,x);
            if(e == 0){
                g << -1 << '\n';
            }else{
                g << e << '\n';
            }
        }
    }
    return 0;
}