Cod sursa(job #304694)

Utilizator utcistuBarcau Tomsa utcistu Data 15 aprilie 2009 01:48:02
Problema Arbori indexati binar Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 1.7 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void update (int *aib,int x,int y,int n)
{
    int ind;
    ind=x;
    while (ind<=n)
    {
        aib[ind]+=y;
        ind+=ind^(ind&(ind-1));
    }
}

int query (int *aib,int st,int dr)
{
    int sum1=0,sum2=0,ind;
    ind=dr;
    while (ind>0)
    {
        sum1+=aib[ind];
        ind-=ind^(ind&(ind-1));
    }
    ind=st-1;
    while (ind>0)
    {
        sum2+=aib[ind];
        ind-=ind^(ind&(ind-1));
    }
    return sum1-sum2;
}

int query2 (int *aib,int x,int n)
{
    int step,cnt;
    for (step=1;step<n;step<<=1);
    for (cnt=0;step;step>>=1)
    {
        if (cnt+step<n)
        if (query(aib,1,cnt+step)<=x)
            cnt+=step;
    }
    if (query(aib,1,cnt)==x)
        return cnt;
    else
        return -1;
}

int main()
{
    FILE *fin,*fout;
    fin=fopen("aib.in","r");
    fout=fopen("aib.out","w");
    int *aib,n,i,m,cmd,x,y,st,dr;
    fscanf(fin,"%d %d",&n,&m);
    aib=(int *)malloc(sizeof(int)*(n+1));
    memset(aib,'\0',sizeof(int)*(n+1));
    for (i=1;i<=n;i++)
    {
        fscanf(fin,"%d",&x);
        update(aib,i,x,n);
    }
    for (i=0;i<m;i++)
    {
        fscanf(fin,"%d",&cmd);
        switch (cmd)
        {
        case 0:
            fscanf(fin,"%d %d",&x,&y);
            update(aib,x,y,n);
            break;
        case 1:
            fscanf(fin,"%d %d",&st,&dr);
            fprintf(fout,"%d\n",query(aib,st,dr));
            break;
        case 2:
            fscanf(fin,"%d",&x);
            fprintf(fout,"%d\n",query2(aib,x,n));
            break;
        default:break;
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}