Cod sursa(job #786509)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 11 septembrie 2012 15:45:12
Problema Arbori indexati binar Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <cstdio>
#include <cmath>
#include <iostream>
#define indice(i) ((i-1)/radn+1)
using namespace std;

int A[100005];
int batog[350];

int main()
{
	int n,m;
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%d %d",&n,&m);
	int radn=(int)sqrt(double(n));

	for(int i=1;i<=n;i++)
	{
		scanf("%d",&A[i]);
		batog[indice(i)]+=A[i];	
	}
	batog[indice(n)+1]=1;
	A[n+1]=1;
	for(int i=1;i<=m;i++)
	{
		//cout<<i<<" ";
		int op,a,b;
		long long S=0;
		scanf("%d",&op);
		if(op!=2)
		{
			scanf("%d %d",&a,&b);
			if(op==0)
			{
				batog[indice(a)]+=b;
				A[a]+=b;
			}
			if(op==1)
			{
			//	cout<<"ia :"<<indice(a)<<" ib "<<indice(b)<<endl;
				for(int j=indice(a)+1;j<=indice(b)-1;j++)
					S+=batog[j];
				if(indice(a)==indice(b))
					for(int j=a;j<=b;j++)
						S+=A[j];
				else
				{
				//	cout<<" a : "<<a<<" chestie : "<<indice(a)*radn<<endl;
					for(int j=a;j<=indice(a)*radn;j++)
						S+=A[j];
					
					//cout<<" b : "<<b<<" chestie : "<<(indice(b)-1)*radn+1<<endl;
					for(int j=b;j>=(indice(b)-1)*radn+1;j--)
						S+=A[j];
				}
			printf("%lld\n",S);
			}
		}
		else
		{
			int S=0;
			scanf("%d",&a);
			int ind=0;
			while(S<=a)
				S+=batog[++ind];
			
			S-=batog[ind];
			//cout<<" S ff "<<S<<endl;
			//cout<<" ind : "<<ind<<endl;
			int j;
			for(j=(ind-1)*radn+1;S<=a;j++)
				S+=A[j];
			
			//cout<<"  S : "<<S<<" A : "<<A[j]<<endl;
			if((S-A[j-1])!=a)
				printf("-1\n");
			else
				printf("%d\n",j-2);
			
		}
		
		
	
	}
	return 0;
}