Pagini recente » Cod sursa (job #2991114) | Cod sursa (job #1200768) | Cod sursa (job #3191245) | Cod sursa (job #3282076) | Cod sursa (job #3196006)
#include<bits/stdc++.h>
using namespace std;
const int N = 100009;
ifstream in ("aib.in");
ofstream out("aib.out");
// auto& in = cin;
// auto& out = cout;
int n, m, tree[N];
int read(int idx) {
int total = 0;
while(idx) {
// out<<"reading "<<idx<<endl;
total += tree[idx];
idx -= (idx & -idx);
}
return total;
}
void update(int idx, int val) {
while(idx <= n) {
// out<<"updating "<<idx<<endl;
tree[idx] += val;
idx += (idx & -idx);
}
}
int find(int cumFreq) {
int idx = 0;
for(int bitM = 1 << 30; bitM; bitM /= 2) {
int checkP = idx + bitM;
if(checkP <= n && tree[checkP] <= cumFreq) {
cumFreq -= tree[checkP];
idx = checkP;
}
}
if(!cumFreq) return idx;
return -1;
}
int main(){
in>>n>>m;
int x;
for(int i = 1; i <= n; i++) {
in>>x;
update(i, x);
}
int op, a, b;
for(int i = 0; i < m; i++) {
in>>op;
switch(op) {
case 0:
in>>a>>b;
update(a, b);
break;
case 1:
in>>a>>b;
out<<read(b) - read(a-1)<<endl;
break;
default:
in>>a;
out<<find(a)<<endl;
}
}
return 0;
}