Cod sursa(job #1970342)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 19 aprilie 2017 11:27:45
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<cstdio>

using namespace std;

const int NMAX = 100000;
const int MMAX = 150000;

int n, m;
int aib[1 + 2 * NMAX];
int val;

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

int querry(int pos)
{
    int s = 0;
    for(;pos > 0; pos -= (pos & (-pos)))
    {
        s += aib[pos];
    }
    return s;
}

int querry2(int s)
{
    int temp = val;
    int i = 0;
    while(temp != 0)
    {
        if(i + temp <= n && s >= aib[i + temp])
        {
            s -= aib[i + temp];
            i += temp;
            if(s == 0)
            {
                return i;
            }
        }

        temp >>= 1;
    }
    return -1;
}

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);

    scanf("%d %d", &n, &m);

    val = 1;
    while(val <= n)
    {
        val <<= 1;
    }
    val >>= 1;

    int t, x, y;
    for(int i = 1; i <= n; i++)
    {
        scanf("%d", &x);
        update(i, x);
    }

    int output;
    for(int i = 1; i <= m; i++)
    {
        scanf("%d", &t);
        if(t == 0)
        {
            scanf("%d %d", &x, &y);
            update(x, y);
        }
        else if(t == 1)
        {
            scanf("%d %d", &x, &y);
            output = querry(y) - querry(x - 1);
            printf("%d\n", output);
        }
        else
        {
            scanf("%d", &x);
            output = querry2(x);
            printf("%d\n", output);
        }
    }
}