Cod sursa(job #545842)

Utilizator acelasi7Tudor Maxim acelasi7 Data 3 martie 2011 23:07:36
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 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;mij=(dr+st)/2;
    while(st<dr&&suma(mij)!=a)
    {
        if(suma(mij)>a)
            dr=mij-1;
        else st=mij+1;
        mij=(st+dr)/2;
    }
    if(suma(mij)==a)
        fprintf(out,"%d\n",mij);
    else 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;
}