Cod sursa(job #309787)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 1 mai 2009 01:46:27
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<stdio.h>
#include<string.h>
FILE*fin=fopen("aib.in","r");
FILE*fout=fopen("aib.out","w");
#define nm 100005
#define zero(x)((x^(x-1))&x)
int aib[nm],n,m;
int query(int poz)
{
    int ans=0;
    while(poz>0)
    {
      ans+=aib[poz];
      poz-=zero(poz);
    }
    return ans;
}
void update(int poz,int nr)
{
     while(poz<=n)
     {
       aib[poz]+=nr;
       poz+=zero(poz);
     }
}
int main()
{
    int i,op,st,dr,mij,nr,poz,a,b,sum;
    fscanf(fin,"%d%d",&n,&m);
    memset(aib,0,sizeof(aib));
    for(i=1;i<=n;i++)
    {
      fscanf(fin,"%d",&nr);
      update(i,nr);
    }
    for(i=1;i<=m;i++)
    {
      fscanf(fin,"%d",&op);
      if(op==0)
      {
        fscanf(fin,"%d%d",&poz,&nr);
        update(poz,nr);
      }
      if(op==1)
      {
        fscanf(fin,"%d%d",&a,&b); 
        fprintf(fout,"%d\n",query(b)-query(a-1));
      }
      if(op==2)
      {
        fscanf(fin,"%d",&nr);
        st=0;dr=n;
        
          while(st<dr)
          {
	        mij=(st+dr)/2;
	        if(query(mij)>=nr) dr=mij;
	        else st=mij+1;
          }
        
        if(query(st)==nr) fprintf(fout,"%d\n",st);
        else fprintf(fout,"-1\n");
      }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}