Pagini recente » Cod sursa (job #3329734) | Cod sursa (job #2950278) | Cod sursa (job #1367829) | Cod sursa (job #1417052) | Cod sursa (job #3333030)
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int Nmax = 100005;
int n, q;
int aib[Nmax];
void actualiare_aib(int poz, int val){
while(poz <= n){
aib[poz] += val;
poz += poz & (-poz);
}
}
int interogare_aib(int poz){
int sol = 0;
while(poz > 0){
sol += aib[poz];
poz -= poz & (-poz);
}
return sol;
}
int interogare(int x, int y){
return interogare_aib(y) - interogare_aib(x - 1);
}
int caut_bin(int val){
int putere_2, poz_anterior, adunat_anterior;
putere_2 = (1 << int(log2(n)));
adunat_anterior = poz_anterior = 0;
while(putere_2 > 0){
if(poz_anterior + putere_2 <= n){
if(adunat_anterior + aib[poz_anterior + putere_2] == val){
return poz_anterior + putere_2;
}
else if(adunat_anterior + aib[poz_anterior + putere_2] < val){
poz_anterior += putere_2;
adunat_anterior += poz_anterior;
}
}
putere_2 /= 2;
}
return -1;
}
void citire_sir_initial(){
int val;
fin >> n >> q;
for(int i = 1; i <= n; i++){
fin >> val;
actualiare_aib(i, val);
}
}
void citire_si_rezolvare_interogari(){
int tip, poz, val, start, finish;
for(int i = 1; i <= q; i++){
fin >> tip;
if(tip == 0){
fin >> poz >> val;
actualiare_aib(poz, val);
}
else if(tip == 1){
fin >> start >> finish;
fout << interogare(start, finish) << '\n';
}
else{
fin >> val;
fout << caut_bin(val) << '\n';
}
}
}
int main(){
citire_sir_initial();
citire_si_rezolvare_interogari();
return 0;
}