Cod sursa(job #174461)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 8 aprilie 2008 21:19:11
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<stdio.h>   
long x[100001],n,m,i,val,ad,poz,cod,st,dr,s,salt,saltmax,ok;
int main()   
{   
    freopen("aib.in","rt",stdin);   
    freopen("aib.out","wt",stdout);   
    scanf("%ld%ld",&n,&m);   
    saltmax=1;   
    while(saltmax<=n)saltmax<<=1;
    for(i=1;i<=n;i++)
    { scanf("%ld",&val);
      poz=i;
      for(ad=1;poz<=n;ad<<=1)
       if(ad&poz){x[poz]+=val;poz+=ad;}
    }
    for(;m;m--)
    { scanf("%ld",&cod);
      if(!cod)
      { scanf("%ld%ld",&poz,&val);
	for(ad=1;poz<=n;ad<<=1)
	 if(ad&poz){x[poz]+=val;poz+=ad;}
	continue;
      }
      if(cod==1)
      { scanf("%ld%ld",&st,&dr);
	s=0;
	poz=dr;
	for(ad=1;poz;ad<<=1)
	 if(ad&poz){s+=x[poz];poz-=ad;}
	poz=st-1;
	for(ad=1;poz;ad<<=1)
	 if(ad&poz){s-=x[poz];poz-=ad;}
	printf("%ld\n",s);
	continue;
      }
      scanf("%ld",&s);
      if(!s){printf("0\n");continue;}
      poz=0;ok=0;
      for(salt=saltmax;salt;salt>>=1)
      { if(poz+salt>n)continue;
	if(s==0){printf("%ld\n",poz);ok=1;break;}
	if(s<x[poz+salt])continue;
	poz+=salt;s-=x[poz];
      }
      if(!ok)printf("-1\n");
    }
    fcloseall();
    return 0;
}