Pagini recente » Cod sursa (job #495250) | Cod sursa (job #2985879) | Cod sursa (job #672356) | Cod sursa (job #2393630) | Cod sursa (job #1786857)
#include <cstdio>
#define NMAX 100000
#define MAX (1<<31)-1
using namespace std;
int v[NMAX+1];
int n, m;
void update(int pos, int val){
while(pos<=NMAX){
v[pos] += val;
pos += (pos&(-pos));
}
}
int read(int pos){
int res = 0;
while(pos != 0){
res += v[pos];
pos -= (pos&(-pos));
}
return res;
}
int searchSum(int sum){
int s, e, m;
s = 1;
e = n+1;
while(s<e){
m = (s+e)/2;
int crt;
crt = read(m);
if(crt>=sum){
e = m;
}
else if(crt<sum){
s = m+1;
}
}
return read(e)==sum?e:-1;
}
int main()
{
FILE *f = fopen("aib.in", "r");
FILE *f1 = fopen("aib.out", "w");
fscanf(f, "%d %d", &n, &m);
for(int i=0;i<n;i++){
int x;
fscanf(f, "%d", &x);
update(i+1, x);
}
for(int i=0;i<m;i++){
int a, b, x;
fscanf(f, "%d", &x);
if(x == 0){
fscanf(f, "%d %d", &a, &b);
update(a, b);
}
else if(x == 1){
fscanf(f, "%d %d", &a, &b);
int res = read(b) - read(a-1);
fprintf(f1, "%d\n", res);
}
else if(x == 2){
fscanf(f, "%d", &a);
int res = searchSum(a);
fprintf(f1, "%d\n", res);
}
}
return 0;
}