Pagini recente » Cod sursa (job #2764667) | Cod sursa (job #1004793) | Cod sursa (job #1097008) | Cod sursa (job #869095) | Cod sursa (job #1612883)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
typedef unsigned int ui;
ui marime_uierval(const ui n){
return (n+1)&(-n-1);
}
class aib{
ui n;
vector<ui> buf;
public:
aib(const ui N): n(1<<(ui)ceil(log2(N))), buf(n){}
void update(ui p, const ui v){
for( ; p < n; p += marime_uierval(p)){
buf[p] += v;
}
}
ui query(int p){
ui rez = 0;
for( ; p >= 0; p -= marime_uierval(p)){
rez += buf[p];
}
return rez;
}
int search(const ui k){
if(buf.back() < k){
return -2;
}
ui poz = n-1, suma_st = 0;
for( ; marime_uierval(poz) > 1; ){
if(suma_st + buf[poz] > k){
poz -= marime_uierval(poz)/2;
}
else if(suma_st + buf[poz] == k){
return poz;
}
else{
suma_st += buf[poz];
poz += marime_uierval(poz)/2;
}
}
if(suma_st + buf[poz] == k){
return poz;
}
return -2;
}
};
int main()
{
ifstream f("aib.in");
ofstream g("aib.out");
ui n, m;
f >> n >> m;
aib ai(n);
for(ui i = 0, x; i < n; ++i){
f >> x;
ai.update(i, x);
}
for(ui i = 0, t, a, b; i < m; ++i){
f >> t;
if(t == 0){
f >> a >> b;
ai.update(a-1, b);
}
else if(t == 1){
f >> a >> b;
g << (ai.query(b-1) - ai.query(a-2)) << '\n';
}
else{
f >> a;
g << ai.search(a)+1 << '\n';
}
}
return 0;
}