Cod sursa(job #2633726)

Utilizator KlinashkaDiacicov Calin Marian Klinashka Data 8 iulie 2020 13:17:48
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.88 kb
#include <bits/stdc++.h>
using namespace std;

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

const int NMAX=1e5;

int N, t[NMAX+1];

int f(int i) {
	return i&(-i);
}

int query(int i) {
	int sol=0;
	while(i>0) {
		sol+=t[i];
		i-=f(i);
	}
	return sol;
}

void add(int i, int x) {
	while(i<=N) {
		t[i]+=x;
		i+=f(i);
	}
}

int find(int x) {
	int k=log2(N), r=0, cur=0;
	for(int i=(1<<k);i>=1;i/=2) {
		if(r+i<=N && cur+t[r+i]<x) {
			r+=i;
			cur+=t[r];
		}
	}
	++r;
	if(query(r)!=x)
		return -1;
	return r;
}	

int main() {
	int M;
	int p, a, b;
	fin>>N>>M;
	for(int i=1;i<=N;++i) {
		fin>>a;
		add(i, a);
	}
	for(int i=1;i<=M;++i) {
		fin>>p;
		if(p==0) {
			fin>>a>>b;
			add(a, b);
		}
		if(p==1) {
			fin>>a>>b;
			fout<<(query(b)-query(a-1))<<'\n';
		}
		if(p==2) {
			fin>>a;
			fout<<find(a)<<'\n';
		}
	}
	return 0;
}