Cod sursa(job #1148356)

Utilizator vyrtusRadu Criuleni vyrtus Data 20 martie 2014 18:27:18
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <conio.h>

#define nmax 100001

using namespace std;
long sum[nmax];
long a,b,n,m, sol ;

void update(int poz , int val)
{
    while (poz <= n)
    {
        int p = 0;
        while (!(poz & (1 << p)) ) {p++;}
        sum[poz] += val;
        poz += (1<<p);
    }
}

long query(int num)
{
    int s = 0;
        while (num > 0)
        {
           int p = 0;
        while (!(num & (1 << p)) ) {p++;}
            s += sum[num];
            num -= (1 << p);
        }
    return s;
}

int search(int low,int high , int val)
{
    int mid;
    while (low != high)
    {
    mid = (low + high) / 2;
        int c = query(mid);
            if (c == val) return mid;
            if (c > val) {high = mid - 1; if (high > 1) high--; }
                    else {low  = mid + 1; if (low < n) low++;}
    if (low == high)
       if (query(low) == val) return low;
                else return -1;

    }
}

int main()
{
    freopen("aib.in" , "r" , stdin);
    freopen("aib.out", "w" ,stdout);
        scanf("%d%d",&n,&m );
        for (int i=1;i<=n;i++)
        {
            int x;
            scanf("%d",&x);
            update(i,x);
        }

    for (int i =1;i<=m;i++)
    {
        int x;
         scanf("%d",&x);
        if (x == 0) { int poz;  scanf("%d%d",&poz,&a); update(poz,a); }
            else if (x == 1)
                { scanf("%i%i",&a,&b);
                    sol = query(b) - query(a-1);
                    printf("%d\n",sol);
                }
                else
                {
                    int k; scanf("%d",&k);
                    printf("%d\n",search(1,n,k));
                }
    }
    return 0;
}