Cod sursa(job #1807596)

Utilizator cyber_ghSoltan Gheorghe cyber_gh Data 16 noiembrie 2016 19:07:27
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <bits/stdc++.h>


using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int ind,val,arr[400005],left1,right1,n,m;


void update(int st,int dr,int poz){
	
	if (st==dr){
	 arr[poz]-=val ;
	return;
}

	int mid=(st+dr)/2;
	if (ind<=mid) {
		update(st,mid,poz*2);
	}
	else {
		update(mid+1,dr,poz*2+1);
	}
//	arr[poz]=max(arr[2*poz],arr[poz*2+1]);// sum
arr[poz]=arr[poz*2]+arr[poz*2+1];
	
}


int querry(int st,int dr,int poz){//(1,n,1)
	
	if (st>=left1&&dr<=right1) return arr[poz];
	int a=0,b=0,mid=(st+dr)/2;
	if (left1<=mid) {
		a=querry(st,mid,poz*2);
	}
	if (right1>mid){
		b=querry(mid+1,dr,poz*2+1);
	}
	//return max(a,b);//a+b
	return a+b;
}

int main(){
	fin >>n>>m;
	for(int i=1;i<=n;i++) {
		int x;
		fin>>x;
		ind=i;
		val=-x;
		update(1,n,1);
		//cout <<x<<endl;
	}
	//for(int i=1;i<=4*m;i++) cout <<arr[i]<<" ";
	for(int i=1;i<=m;i++){
		int caz;
		fin>>caz;
		if (caz==0) {
			fin>>ind>>val;
			update(1,n,1);
		}
		if(caz==1) {
			fin>>left1>>right1;
			fout <<querry(1,n,1)<<"\n";
		}
	}
	
	return 0;
	
	
}