Cod sursa(job #3177831)

Utilizator TheEpicWipedCreaVlad Chirita Alexandru TheEpicWipedCrea Data 30 noiembrie 2023 10:10:55
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in  ("aib.in");
ofstream out("aib.out");

int n,m;
#define maxN 100000 

int v[maxN+1],aib[maxN+1];

void update(int poz,int val){
	while(poz<=n){
		aib[poz]+=val;
		poz=poz+(poz & (poz ^ (poz-1)));
	}
}

int query(int poz){
	int res=0;
	while(poz>0){
		res+=aib[poz];
		poz=poz-(poz & (poz ^ (poz-1)));
	}
	return res;
}

int cautare_binara(int x) {
	int res=0;
	for(int i=17;i>=0;i--){
		if((res+(1<<i))<=n && query(res+(1<<i))<x){
			res+=(1<<i);
		}
	}
	return res+1;
}

int main(){
	in>>n>>m;
	for(int i=1;i<=n;i++){
		in>>v[i];
		update(i,v[i]);
	}
	for(int i=1;i<=m;i++){
        int type,x,y;
		in>>type;
		if(type==0){
			in>>x>>y;
			update(x,y);
		}
		else if(type==1){
			in>>x>>y;
			out<<query(y)-query(x-1)<<'\n';
		}
		else{
			in>>x;
			int res=cautare_binara(x);
			if(res==n+1 || query(res)!=x){
                out<<"-1"<<'\n';
            }
			else{
                out<<res<<'\n';
            }
		}
	}
}