Pagini recente » Cod sursa (job #1726141) | Cod sursa (job #2842369) | Cod sursa (job #318324) | Cod sursa (job #1180048) | Cod sursa (job #2002877)
#include <iostream>
#include <fstream>
#include <stdio.h>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int arb[400001];
int n, m;
void Adaugare(int indice, int val){
int pozBit0 = 0;
while(indice <= n){
arb[indice] = arb[indice] + val;
while(!(indice & (1<<pozBit0)))
pozBit0++;
indice = indice + (1<<pozBit0);
pozBit0++;//avem poz zerouri terminale si nu aducem la zero deoarece nr creste in dreapta
}
}
int Suma(int dr){
int suma = 0;
int pozBit0 = 0;
while(dr > 0){
suma += arb[dr];
while(!(dr & (1<<pozBit0)))
pozBit0++;
dr = dr - (1<<pozBit0);
pozBit0++;
}
return suma;
}
int cautare(int val){
int index;
int pozMinima = 0;
for(index = 1; index < n; index = index<<1);//numarul care poate fi scris ca putere al lui 2 >= n
for(pozMinima = 0;index > 0; index = index >>1){
if(pozMinima + index <= n && val >= arb[pozMinima + index]){
pozMinima += index;
val = val - arb[pozMinima];
if(! val)
return pozMinima;
}
}
return -1;
}
void citire(){
in >> n >> m;
for(int i = 1; i <= n; i++){
int x;
in >> x;
Adaugare(i, x);
}
for(int i = 1; i <= m; i++){
int tip, a, b;
in >> tip;
if(tip == 0){
in >> a >> b;
Adaugare(a, b);
}
else if(tip == 1){
in >> a >> b;//[a,b] = [1, b] - [1, a)
out << Suma(b) - Suma(a - 1) << '\n';
}
else{
in >> a;
out << cautare(a) << '\n';
}
}
}
int main(){
citire();
return 0;
}