Pagini recente » Cod sursa (job #846116) | Cod sursa (job #2307593) | Cod sursa (job #899915) | Profil vocakupe | Cod sursa (job #1612105)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
int marime_interval(const int n){
return (n+1)&(-n-1);
}
class aib{
int n;
vector<int> buf;
public:
aib(const int N): n(1<<(int)ceil(log2(N))), buf(n){}
void update(int p, const int v){
for( ; p < n; p += marime_interval(p)){
buf[p] += v;
}
}
int query(int p){
int rez = 0;
for( ; p >= 0; p -= marime_interval(p)){
rez += buf[p];
}
return rez;
}
int search(const int k){
if(buf.back() < k){
return -2;
}
int poz = n-1, suma_st = 0;
for( ; marime_interval(poz) > 1; ){
if(suma_st + buf[poz] > k){
poz -= marime_interval(poz)/2;
}
else if(suma_st + buf[poz] == k){
return poz;
}
else{
suma_st += buf[poz];
poz += marime_interval(poz)/2;
}
}
if(suma_st + buf[poz] == k){
return poz;
}
return -2;
}
};
int main()
{
ifstream f("aib.in");
ofstream g("aib.out");
int n, m;
f >> n >> m;
aib ai(n);
for(int i = 0, x; i < n; ++i){
f >> x;
ai.update(i, x);
}
for(int 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 << min(ai.search(a)+1, n) << '\n';
}
}
return 0;
}