Cod sursa(job #304703)

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

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

int sum (int *aib,int dr)
{
    int sum=0,ind=dr;
    for (;ind;ind-=ind^(ind&(ind-1))) sum+=aib[ind];
    return sum;
}

int query (int *aib,int st,int dr)
{
    return sum(aib,dr)-sum(aib,st-1);
}

int search (int *aib,int x,int n)
{
    int step,cnt;
    for (step=1;step<n;step<<=1);
    for (cnt=1;step;step>>=1)
    {
        if (cnt+step<=n)
        if (sum(aib,cnt+step)<=x)
            cnt+=step;
    }
    if (sum(aib,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",search(aib,x,n));
            break;
        default:break;
        }
    }
    fclose(fout);
    return 0;
}