Pagini recente » Cod sursa (job #1931805) | Borderou de evaluare (job #432871) | Cod sursa (job #2539361) | Borderou de evaluare (job #2015680) | Cod sursa (job #3267161)
#include <iostream>
using namespace std;
int n, m, c, x;
int a, b;
int pos;
int aib[100005]; // dimensiune N
void update(int i, int x) {
for (int j=i;j<=n;j+=(j&-j)) { // j+=(j&-j) -> trecem prin numerele care il contin in suma pe elementul de pe pozitia i
aib[j] += x;
}
}
void create() {
for (int i=1;i<=n;i++) {
cin >> x;
update(i, x);
}
}
int query(int i) {
int s = 0;
for (int j=i;j>=1;j-=(j&-j)) { // j -= (j&-j) -> eliminam cel mai din dreapta bit de 1 la fiecare pas, j&(-j) reprezinta cel mai din dreapta bit de 1, putem sa il eliminam deoarece j contine exact suma a j&(-j) elemente, deci cu exact atatea elemente mergem in spate
s += aib[j];
}
return s;
}
int cb(int st, int dr)
{
int mij = (st+dr)/2;
int s = query(mij);
if(s == a)
return mij;
if(st == dr)
return -1;
if(s > a)
return cb(st, mij);
if(s < a)
return cb(mij+1, dr);
}
void solve() {
cin >> c;
if (c == 0) {
cin >> a >> x;
update(a, x);
}
else if (c == 1) {
cin >> a >> b;
cout << query(b) - query(a-1) << '\n';
}
else {
cin >> a;
cout << cb(1,n) << '\n';
}
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
cin >> n >> m;
create();
for(;m;m--) {
solve();
}
return 0;
}