Pagini recente » Cod sursa (job #1391016) | Cod sursa (job #2824189) | Cod sursa (job #355260) | Cod sursa (job #2707879) | Cod sursa (job #2158681)
#include <iostream>
#include <fstream>
#define DMAX 100010
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int aib[DMAX], n;
int m;
void actualizareAIB(int val, int plec){
for(int i = plec; i <= n; i+= i & (-i)){
aib[i] += val;
}
}
void citire(){
in >> n >> m;
for(int i = 1; i <= n; i++){
int temp;
in >> temp;
actualizareAIB(temp, i);
}
}
int sumaPanaIn(int indice){
int suma = 0;
for(int i = indice; i > 0; i-= i & (-i)){
suma += aib[i];
}
return suma;
}
int cautPoz(int val){
int st = 1, dr = n, mij;
int pozitie = -1;
while(st <= dr){
mij = (st + dr) / 2;
int suma = sumaPanaIn(mij);
if(suma == val){
pozitie = mij;
dr = mij - 1;
}else if(suma < val){
st = mij + 1;
}else if(suma > val){
dr = mij - 1;
}
}
return pozitie;
}
void rezolvare(){
for(int i = 1; i <= m; i++){
int caz;
in >> caz;
if(caz == 0){
int a, b;
in >> a >> b;
actualizareAIB(b, a);
}else if(caz == 1){
int a, b;
in >> a >> b;
out << sumaPanaIn(b) - sumaPanaIn(a - 1)<<'\n';
}else{
int a;
in >> a;
out << cautPoz(a) <<'\n';
}
}
}
int main() {
citire();
rezolvare();
return 0;
}