Cod sursa(job #854674)

Utilizator krissu93FMI Tiugan Cristiana Elena krissu93 Data 13 ianuarie 2013 20:43:58
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <fstream>
#include <iostream>
#define nmax 15001

using namespace std;

ifstream in("datorii.in");
ofstream out("datorii.out");

int v[nmax];
int smen[150];
int n,m;
int rada=0;
void get_data(){
	in>>n>>m;
	for (int i=1;i<=n;i++)
		in>>v[i];
}

int radacina(int n){
	int i=1;
	while (i*i<=n) i++;
	/*if (i*i==n) return i ;
		else */return --i;
}

void transform(){
	int i,j;
	j=1;
	for (i=1;i<=n;i++){
		smen[j]+=v[i];
	if (i==j*rada)
		j++;
	}
}

void refresh(int a, int suma){
	v[a]-=suma;
	int ok=0;//inca nu am gasit zona
	int zona=1;//suntem in zona 1
	int st=1;
	int dr=st+rada-1;
	
	while ((ok==0)&&(st<=n)){
	if ((st<=a) && (a<=dr)){
			//iii am gasit zona:))
		smen[zona]-=suma;ok=1;
	}
	zona++;
	st=dr+1;
	dr=dr+rada;
	}
}
	

int ask(int x, int y) { //suma din intervalul x,y 
	int st=1;
	int zona=1;
	int suma=0;
	int dr=rada+st-1;
	int x1,y1;
	while (st<=n){
		if (st>=x) x1=st;  //.x..st=x1
			else x1=x; /// st..x=x1
		if (dr<=y) y1=dr; //y2=dr...y
			else y1=y; ///y2=y....dr
		if (y1>n) y1=n;
		if ((x1==st) && (y1==dr)) suma+=smen[zona];
		else
		{
			for(int j=x1;j<=y1;j++) suma+=v[j];
		}
		st=dr+1;
		dr+=rada;
		zona++;
	}
	return suma;
}


			
int main()
{ int a,b,op;
	get_data();
	rada=radacina(n);
	transform();
	
	for (int i=1;i<=m;i++){
		in>>op>>a>>b;
		if (op==0) refresh(a,b);
		else out<<ask(a,b)<<'\n';
		
	}
return 0;
}