Cod sursa(job #2257684)

Utilizator b10nd3Oana Mancu b10nd3 Data 10 octombrie 2018 12:52:53
Problema Arbori indexati binar Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<iostream>
#include<fstream>
#include<string.h>

using namespace std;

int n;

void update(int poz,int value,long long a[]){
	do{
		a[poz]+=value;
		poz=poz+(poz&-poz);  //+cea mai mica putere a lui 2 din descompunerea lui poz 
		//int c=0; while( !( (1<<c) & poz) ) c++; poz+=1<<c; c++; 
	} while (poz<=n);
}


long long sum(int poz,long long a[]){
	long long s=0;
	while(poz){
		s+=a[poz];
		poz=poz-(poz & -poz);
	}
	return s;
}



int search(long long s, long long a[]){
	int poz=1,i=0;
	while(poz<=n) poz=poz<<1;
    while(poz){
    	poz=poz>>1; 
    	if(i+poz<=n && a[i+poz]<=s){
    		 i+=poz;  
			 s-=a[i];  
    		 if(s==0) return i;
		}   
	}  
	return -1;
}


int main(){
	int i,x,c,m,y;
	long long s;
	FILE *in=fopen("aib.in","r"),*out=fopen("aib.out","w");
	fscanf(in,"%i %i",&n,&m); 
	long long a[n+1];
	memset(a,0,sizeof(a));
	for(i=1;i<=n;i++){
		fscanf(in,"%i",&x);
		update(i,x,a);
	}
	
	for(i=1;i<=m;i++){
		fscanf(in,"%i",&c);
		switch(c){
			case 0:{
				fscanf(in,"%i %i",&x,&y);
				update(x,y,a); 
				break;
			}
			case 1:{
				fscanf(in,"%i %i",&x,&y);
				fprintf(out,"%lld\n",sum(y,a)-sum(x-1,a));
				break;
			}
			case 2:{
				fscanf(in,"%lld",&s);
				fprintf(out,"%i\n",search(s,a));
				break;
			}
			default: break;
		}
	}
	
	fclose(in); fclose(out);
	return 0;
}