Cod sursa(job #1425532)

Utilizator justaddcodeJustadd Code justaddcode Data 27 aprilie 2015 16:53:48
Problema Arbori indexati binar Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define Nmax 100004
#define zeros(x) ( (x ^ (x - 1)) & x )
using namespace std;
int n, i, j, m;
int v[Nmax],aib[Nmax];
int sum(int x)
{
    int suma = 0, i;
    for (i = x;i >= 1; i -= zeros(i) )
    suma += aib[i];
    return suma;
}
void add(int x, int y)
{
     int i;
     for (i = x; i <= n; i += zeros(i) )
     aib[i] += y;
}
void querry0()
{
    int a, b;
    scanf("%d %d", &a, &b);
    add(a, b);
}
void querry1()
{
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d\n", sum(b) - sum(a - 1));
}
int querry2()
{
    int a, pas = 1<<16, i = 0;
    scanf("%d", &a);
    while (pas)
    {
        if (i + pas <= n && sum(i+pas) < a)
        i += pas;
        pas /= 2;
    }
    if (sum(i + 1) == a)
    return i + 1;
    return -1;
}
int main()
{
    int q = 0;
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for (i = 1; i<= n; ++i)
    {
        scanf("%d", &v[i]);
        add(i,v[i]);
    }
    while (m--)
    {
        scanf("%d", &q);
        if (q == 0) querry0();
        else if (q == 1) querry1();
        else printf("%d\n", querry2());
    }
    return 0;
}