Cod sursa(job #1605476)

Utilizator bence21Bako Bence bence21 Data 19 februarie 2016 02:07:41
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.19 kb
#include<iostream>
#include<stdio.h>
using namespace std;
long n,m;
long t[100005];
long o[100005];
long keres(long x)
{
	long i=1,j=n,k;
	while(i<=j)
	{
		k=(i+j)/2;
		if(t[k]==x)
			return k;
		if(t[k]<x)
			i=k+1;
		else j=k-1;
	}
	return -1;
}
bool volt;
void ad(long a,long b)
{
	int i;
	for(i=a;i<=b;++i)
	{
		t[i]+=o[i];
		o[i+1]+=o[i];
		o[i]=0;
	}
}
struct fa{
	fa *bal,*jobb,*apa;
	long i,j,xb,xj,x;
	int van;
}*q=NULL;
void mad(long i,long b,fa *&q)
{
	long k=(q->i+q->j)/2;
	if(q->i==k)
	{
		t[i]+=q->x;
		t[i+1]+=q->x;
		if(q->i==i)
		{
			t[i]+=b;
			t[i+1]+=b;
			q->x=0;
		}
		else //if(q->j==i)
		{
			t[i]+=b;
		}
		q->x=0;
		return;
	}
	if(q->x)
	{
		q->bal->x+=q->x;
		q->jobb->x+=q->x;
		q->x=0;
		q->van=3;
	}
	if(i<=k)//Balban van
	{
		q->van=3;
		q->jobb->x+=b;
		if(q->van==0)
			q->van=2;
		mad(i,b,q->bal);
	}
	else //jobban van
	{
		q->van=2;
		mad(i,b,q->jobb);
	}

}
void ad2(long a,long b)
{
	//t[a]+=b;
	//q->jobb->x+=b;
	mad(a,b,q->jobb);
}
void init(long i,long j,fa *&q,fa *&apa)
{
	if(i<j)
	{
		fa *uj=new fa;
		uj->apa=apa;
		uj->bal=uj->jobb=NULL;
		uj->i=i;
		uj->j=j;
		uj->x=0;
		uj->van=0;
		uj->xb=0;
		uj->xj=0;
		q=uj;
		init(i,(i+j)/2,q->bal,q);
		init((i+j)/2+1,j,q->jobb,q);
	}
}
void megy(fa *q,int mely)
{
	if(q!=NULL)
	{
		cout<<mely<<": "<<q->i<<" "<<q->j<<"; "<<q->x<<"\n";
		megy(q->bal,mely+1);
		megy(q->jobb,mely+1);
	}
}
void minden(fa *&q)
{
	if(q!=NULL)
	{
		if(q->j-q->i==1)
		{
			t[q->i]+=q->x;
			t[q->j]+=q->x;
			q->x=0;
			return;
		}
		if(q->van==3||q->x)
		{
			q->bal->x+=q->x;
			q->jobb->x+=q->x;
			q->x=0;
			q->van=0;
			minden(q->bal);
			minden(q->jobb);
		}
		else if(q->van==2)
		{
			q->bal->x+=q->x;
			q->jobb->x+=q->x;
			q->x=0;
			q->van=0;
			//minden(q->bal);
			minden(q->jobb);
		}
	}
}
void minden2(long i,long j,fa *&q)
{
	long k=(q->i+q->j)/2;
	if(q->i==k)
	{
		minden(q);
		return;
	}
	if(i>k)//csak jobb
	{
		minden2(i,j,q->jobb);
	}
	else if(j<=k)//csak bal
	{
		minden2(i,j,q->bal);
	}//mindketto
	else minden(q);
}
void beolvas()
{
	FILE * f=fopen("aib.in","r");
	fscanf(f,"%ld %ld",&n,&m);
	//q->apa=q->bal=q->jobb=NULL;
	q=new fa;
	q->jobb=NULL;
	init(1,n,q->jobb,q);
	megy(q->jobb,0);
	;
	long i,x;
	t[0]=0;
	for(i=1;i<=n;++i)
	{
		fscanf(f,"%ld",&x);
		t[i]=t[i-1]+x;
		cout<<t[i]<<" ";
	}
	cout<<"\n";
	int tip,a,b;
	for(i=1;i<=m;++i)
	{
		fscanf(f,"%d %d",&tip,&a);
		cout<<tip<<" "<<a;
		if(tip==2)
		{
			//if(volt)
			//	ad(1,n);
			minden(q->jobb);
			//cout<<"\n";
			//megy(q->jobb,0);
			//cout<<"\n";
			//for(int i=1;i<=n;++i)
			//	cout<<t[i]<<" ";
			cout<<char(9)<<keres(a)<<"\n";
		}
		else
		{
			fscanf(f,"%d",&b);
			cout<<" "<<b;
			if(tip==1)
			{
				//if(volt)
				//	ad(1,b);
				minden2(a,b,q->jobb);
				//cout<<"\n";
				//megy(q->jobb,0);
				//cout<<"\n";
				cout<<char(9)<<t[b]-t[a-1]<<"\n";
			}
			else{
				o[a]+=b;

				ad2(a,b);
				//cout<<"\n";
				//megy(q->jobb,0);
				//for(int i=1;i<=n;++i)
				//	cout<<t[i]<<" ";
				volt=1;
			}
		}
		cout<<"\n";
	}
	fclose(f);
}
int main()
{
	beolvas();
}