Cod sursa(job #174357)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 8 aprilie 2008 19:59:31
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 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);
	  poz=0;ok=0;
	  for(salt=saltmax;salt;salt>>=1)
	  { if(poz+salt<=n)
	     if(s>=x[poz+salt])
	      {poz+=salt;s-=x[poz];}
	    if(!s)
	    {printf("%ld\n",poz);ok=1;break;}
	  }
	  if(!ok)printf("-1\n");
	}
	fcloseall();
	return 0;
}