Pagini recente » Cod sursa (job #790727) | Cod sursa (job #1961434) | Cod sursa (job #545821) | Cod sursa (job #975088) | Cod sursa (job #1608026)
#include <iostream>
#include <stdio.h>
#define MAX 100000
using namespace std;
int aib[MAX+3];
int n,m;
int nr;
void updateT(int p, int nr) {
while(p <= n) {
aib[p] += nr;
p += p-(p&(p-1));
}
}
int sumT(int p) {
int sum = 0;
while(p != 0) {
sum += aib[p];
p = p&(p-1);
}
return sum;
}
int searchT(int st, int dr, int s) {
if(st > dr)
return -1;
int mid = st+((dr-st)/2);
int s2 = sumT(mid);
if(s2 < s)
return searchT(mid+1, dr, s);
if(s2 > s)
return searchT(st, mid-1, s);
return mid;
}
int main() {
FILE *fin = fopen("aib.in", "r");
FILE *fout = fopen("aib.out", "w");
fscanf(fin, "%d %d", &n, &m);
for(int i = 0; i < n; i++) {
fscanf(fin, "%d", &nr);
updateT(i+1, nr);
}
int t,a,b;
for(int i = 0; i < m; i++) {
fscanf(fin, "%d", &t);
if(t == 0) {
fscanf(fin, "%d %d", &a, &b);
updateT(a, b);
} else if(t == 1) {
fscanf(fin, "%d %d", &a, &b);
fprintf(fout, "%d\n", sumT(b)-sumT(a-1));
} else if(t == 2) {
fscanf(fin, "%d", &a);
fprintf(fout, "%d\n", searchT(1, n, a));
}
}
return 0;
}