Cod sursa(job #1043845)

Utilizator Lucian-GeorgeFMI Popa Lucian George Lucian-George Data 28 noiembrie 2013 23:19:30
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include<iostream>
#include<fstream>
#include<stdio.h>
using namespace std;
long arb[400501],a,b,suma,val,v[100001],n,maxpoz=0;
long max(long a, long b)
{
	if (a<b) return b;
	else return a;
}

void update(int poz,int st,int dr, int a, int val)
{
	if (st==dr) {arb[poz]=val; return; }
	int mij=(st+dr)/2;
	if (a<=mij) update(poz*2,st,mij,a,val);
	else update(poz*2+1,mij+1,dr,a,val);
	arb[poz]=arb[2*poz]+arb[2*poz+1];
}

void verif(int poz,int st, int dr)
{
	if (a<=st && dr<=b) {suma=suma+arb[poz]; return;}
	{
		int mij=(st+dr)/2;
		if (a<=mij) verif(2*poz,st,mij);
		if (b>mij) verif(2*poz+1,mij+1,dr);
	}
}
	

int main()
{
	int i,o,x,m;
	FILE *f,*g;
	f=fopen("datorii.in","r");
	g=fopen("datorii.out","w");
	fscanf(f,"%d",&n);
	fscanf(f,"%d",&m);
	for (i=1; i<=n; i++)
	{
		fscanf(f,"%d",&v[i]);
		update(1,1,n,i,v[i]);
	}
	for (i=1; i<=m; i++)
	{
		fscanf(f,"%d",&o);
		fscanf(f,"%d",&a);
		fscanf(f,"%d",&b);
		if (o==1)
		{
			suma=0;
			verif(1,1,n);
			fprintf(g,"%d\n",suma);
		}
		else 
		{
			v[a]=v[a]-b;
			b=v[a];
			update(1,1,n,a,b);
		}
	}
	return 0;
}