Cod sursa(job #1997276)

Utilizator ButmalaiDanButmalai Dan ButmalaiDan Data 3 iulie 2017 20:39:29
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<bits/stdc++.h>
using namespace std;
int n, m, arb[100100], x, q, a, b;
void add(int i, int cost)
{
    for(;i <= 100100; i+= (i&(-i)))
    {
        arb[i] += cost;
    }
}
long long get(int i)
{
    int ans = 0;
    for(; i >= 1; i-= (i&(-i)))
    {
        ans += arb[i];
    }
    return ans;
}
int main()
{
    ifstream cin("aib.in");
    ofstream cout("aib.out");
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        cin >> x;
        add(i,x);
    }
    for (int i = 1 ; i <= m; i++)
    {
        cin >> q;
        if (q != 2)
        {
            cin >> a >> b;
            if (q == 0) add(a,b);
            else
                {
                    cout << get(b) - get(a-1) << "\n";
                }
        }else
            {
                cin >> a;
                long long st = 1, dr = 100000;
                while(dr - st >= 5)
                {
                    long long mid = (st + dr)/2;
                    if (get(mid) >= a) dr = mid;
                    else st = mid;
                }
                bool u = 1;
                for (;st <= dr; st++)
                {
                    if (get(st) == a)
                    {
                        cout << st << "\n";
                        u = 0;
                        break;
                    }
                }
                if (u) cout << "-1\n";
            }
    }
}