Pagini recente » Cod sursa (job #3224325) | Cod sursa (job #2775890) | Cod sursa (job #2733744) | Cod sursa (job #1613914) | Cod sursa (job #3196004)
#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;
}