Cod sursa(job #718293)

Utilizator ILDottoreBogdan Stoian ILDottore Data 20 martie 2012 17:48:52
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<cstdio>
using namespace std;

#define NMAX 100005
#define zero(x) ( x&(-x) )

FILE *f=fopen("aib.in","r");
FILE *g=fopen("aib.out","w");

long aib[NMAX],N,M,a,b;	


void update(long x, long y)
{
	for (long i=x;i<=N;i+=zero(i) )
	  aib[i]+=y;
}

long query(long x, long y)
{  long sum=0;

	for (long i=y;i>0;i-=zero(i) )
	sum+=aib[i];

return sum;	
}


long cauta(long st, long dr,long a)
{
	while (st<=dr)
	{  long mij=(st+dr)/2;
	   long s=query(1,mij);
	   
	   if (s==a)
			return mij;
	   if (s>a)
		    dr=mij-1;
	   if (s<a)
		    st=mij+1;
	}
return -1;}

int main()
{
	fscanf(f,"%ld%ld",&N,&M);
	
	for (long i=1;i<=N;i++)
	{ fscanf(f,"%ld",&b);
	  update(i,b);
	}
	
	for (long i=1;i<=M;i++)
	{ int op;
	  fscanf(f,"%d",&op);
	  
	  if (op==0)
		  { fscanf(f,"%ld%ld",&a,&b);
		  update(a,b);
		  }
	   
	  if (op==1)
	     { fscanf(f,"%ld%ld",&a,&b);
	       fprintf(g, "%ld\n" , query(1,b)-query(1,a-1) );
		 }
	  
	  if (op==2)
		  { fscanf(f,"%ld",&a);
			fprintf(g,"%ld\n",cauta(1,N,a));
		  }
	}
return 0;}