Cod sursa(job #854668)

Utilizator krissu93FMI Tiugan Cristiana Elena krissu93 Data 13 ianuarie 2013 20:37:57
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 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 i=1;//suntem in zona 1
	while (ok==0){
		if (i*i<a) i++;
		else 
		if (i*i==a) {
			ok=1;
			smen[i]-=suma;
		}
		else
		if (i*i>a){
			ok=1;
			smen[i-1]-=suma;
			}
	
	}
}
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<=n;i+=rada){
		cout<<smen[i]<<' ';
	}
	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;
}