Pagini recente » Cod sursa (job #918072) | Cod sursa (job #2968842) | Cod sursa (job #2762803) | Cod sursa (job #471573) | Cod sursa (job #934607)
Cod sursa(job #934607)
#include <fstream>
#define MAX 100005
using namespace std;
int N, M, step, AIB[MAX];
void update(int poz, int val) {
for(; poz <= N; poz += (poz & (-poz)))
AIB[poz] += val;
}
int query(int poz) {
int ans = 0;
for(;poz; poz -= (poz & (-poz)))
ans += AIB[poz];
return ans;
}
int getPoz(int X) {
int poz = 0;
for(int st = step; st; st >>= 1)
if(poz + st <= N && AIB[poz + st] <= X) {
X -= AIB[poz += st];
if(!X) return poz;
}
return -1;
}
int main() {
ifstream in("aib.in"); ofstream out("aib.out");
in>>N>>M;
for(int i = 1, A; i <= N; i++) {
in>>A;
update(i, A);
} for(step = 1; step < N; step <<= 1);
for(int i = 1, A, B, C; i <= M; i++) {
in>>A;
switch(A) {
case 0: in>>B>>C; update(B, C); break;
case 1: in>>B>>C; out<<query(C) - query(B - 1)<<"\n"; break;
case 2: in>>B; out<<getPoz(B)<<"\n"; break;
}
}
return 0;
}