Cod sursa(job #2529499)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 23 ianuarie 2020 16:33:36
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

typedef long long lint;

int ay(int a){
	return (a)&(-a);
}

int n, m;
int d;
int blog(int a){
	int r = 1;
	while(r < a){
		r <<= 1;
	}
	return r;
}

struct aib{
	lint ar[100041];
	void weadd(int p, lint a){
		for(int i = p; i <= n; i += ay(i)){
			ar[i] += a;
		}
	}
	lint weget(int p){
		int s = 0;
		for(int i = p; i > 0; i -= ay(i)){
			s += ar[i];
		}
		return s;
	}
	lint wegetgot(int a, int b){
		return weget(b)-weget(a-1);
	}
	int wefind(lint a){
		int r = 0;
		lint s = 0;
		for(int i = d; i > 0; i >>= 1){
			int x = r+i;
			if(s+ar[x] <= a && x <= n){
				r += i;
				s += ar[x];
			}
		}
		if(s != a){
			r = -1;
		}
		return r;
	}
};
aib de;

int main(){
	fin >> n >> m;
	d = blog(n);
	for(int i = 1; i <= n; ++i){
		int a;
		fin >> a;
		de.weadd(i, a);
	}
	for(int i = 0; i < m; ++i){
		int op;
		fin >> op;
		if(op == 0){
			int a, b;
			fin >> a >> b;
			de.weadd(a, b);
		}else if(op == 1){
			int a, b;
			fin >> a >> b;
			fout << de.wegetgot(a, b) << "\n";
		}else if(op == 2){
			int a;
			fin >> a;
			fout << de.wefind(a) << "\n";
		}
	}
	return 0;
}