Cod sursa(job #545845)

Utilizator acelasi7Tudor Maxim acelasi7 Data 3 martie 2011 23:13:33
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<stdio.h>
#define nrn 100001
#define zzz(x) ((x^(x-1))&x)
using namespace std;
FILE *in=fopen("aib.in","r"),*out=fopen("aib.out","w");
int AIB[nrn],n,m;
void upup(int i,int val)
{
    for(i;i<=n;i+=zzz(i))
        AIB[i]+=val;
}
int suma(int ind)
{
    int i,sum=0;
    for(i=ind;i>0;i-=zzz(i))
        sum+=AIB[i];
    return sum;
}
void unu()
{
    int a,b;
    fscanf(in,"%d %d",&a,&b);
    upup(a,b);
}
void doi()
{
    int a,b;
    fscanf(in,"%d %d",&a,&b);
    fprintf(out,"%d\n",suma(b)-suma(a-1));
}
void trei()
{
    int a,mij,dr,st;
    fscanf(in,"%d",&a);
    dr=n;st=1;
    while(st<=dr)
    {
        mij=(dr+st)/2;
        if(suma(mij)==a)
        {
            fprintf(out,"%d\n",mij);
            return ;
        }
        if(suma(mij)>a)
            dr=mij-1;
        else st=mij+1;
    }
    fprintf(out,"-1\n");
}
int main()
{
    int i,x,c;
    fscanf(in,"%d %d",&n,&m);
    for(i=1;i<=n;++i)
    {
        fscanf(in,"%d",&x);
        upup(i,x);
    }
    for(i=1;i<=m;i++)
    {
        fscanf(in,"%d",&c);
        switch(c)
        {
            case(0):unu();break;
            case(1):doi();break;
            case(2):trei();break;
        }
    }
    return 0;
}