Cod sursa(job #872220)

Utilizator TeOOOVoina Teodora TeOOO Data 5 februarie 2013 21:34:26
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <stdio.h>

//Constante
const int sz = (int)1e5+1;

//Functii
int query(int pos);
int search(int val);
void update(int pos, int val);

//Variabile
FILE *in,*out;

int elements,questions;
int tree[sz];

int main()
{
    in=fopen("aib.in","rt");
    out=fopen("aib.out","wt");

    fscanf(in,"%d%d",&elements,&questions);

    for(int i=1; i<=elements; ++i)
   {
       int value;
       fscanf(in,"%d",&value);
       update(i, value);
   }
    while(questions--)
    {
        int type, rLeft, rRight, value, position;
        fscanf(in, "%d",&type);
        if(type)
        {
            if(type==1)
            {
                fscanf(in,"%d%d",&rLeft,&rRight);
                fprintf(out,"%d\n",query(rRight) - query(rLeft-1));
            }
            else
            {
                fscanf(in,"%d",&value);
                fprintf(out,"%d\n",search(value));
            }
        }
        else
        {
            fscanf(in,"%d%d",&position, &value);
            update(position,value);
        }
    }
    fclose(in);
    fclose(out);
    return 0;
}

void update(int pos, int val)
{
    int power = 0;
    while(pos <= elements)
    {
        tree[pos] += val;
        while(!(1<<power & pos))
            ++power;
        pos += (1<<power);
    }
}

int query(int pos)
{
    int power = 0;
    int sum = 0;
    while(pos)
    {
        sum += tree[pos];
        while(!(1<<power & pos))
            ++power;
        pos -= (1<<power);
    }
    return sum;
}

int search(int val)
{
    int left = 1, right = elements;
    while(left <= right)
    {
        int mid = (left+right) >>1;
        int sum = query(mid);
        if(sum == val)
            return mid;
        if(val < sum)
            right = mid -1 ;
        else left = mid + 1;
    }
    return -1;
}