Cod sursa(job #2070658)

Utilizator TherevengerkingSurani Adrian Therevengerking Data 19 noiembrie 2017 19:53:56
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define ll long
const int Nmax = 100000 + 5;
int n, m, a[Nmax], pas, pasinit = 1;
void update(int x, int y)
{
    for(int i = x; i <= n; i += (i & -i))
        a[i] += y;
}
ll query(int x)
{
    ll sum = 0;
    for(int i = x; i > 0; i -= (i & -i))
        sum += a[i];
    return sum;
}
int cautbin(int x)
{
    pas = pasinit;
    for(int i = 0; i + pas <= n && pas > 0; pas>>= 1)
    {
        if(x >= a[i + pas])
        {
            x -= a[i + pas];
            i = i + pas;
            if(x == 0)
                return i;
        }
    }
    return -1;
}
int main()
{
    fin >> n >> m;

    for(int i = 1, x; i <= n; ++i)
        fin >> x, update(i, x);

    while(pasinit < n)
        pasinit <<= 1;

    for(int i = 1,x, y, vr; i <= m; ++i)
    {
        fin >> vr;
        if(vr == 0)
        {
            fin >> x >> y;
            update(x, y);
        }
        else if(vr == 1)
        {
            fin >> x >> y;
            fout << query(y) - query(x - 1) << '\n';
        }
        else
        {
            fin >> x;
            fout << cautbin(x) << '\n';
        }
    }
    return 0;
}