Pagini recente » Cod sursa (job #990115) | Cod sursa (job #1028063) | Cod sursa (job #220004) | Cod sursa (job #3227330) | Cod sursa (job #1938937)
#include<stdio.h>
FILE *re, *we;
const int SIZ = (1 << 17);
int v[SIZ], n;
void update(int poz, int cat)
{
while(poz <= n) {
v[poz] += cat;
poz += (poz & (-poz));
}
}
int query(int a)
{
int toto = 0;
int put = SIZ;
int poz = 0;
while(put > 0 && a > 0) {
if(put <= a) {
poz += put;
toto += v[poz];
a = a - put;
}
put = (put >> 1);
}
return toto;
}
int caut(int a)
{
int sum = 0;
int put = SIZ;
int poz = 0;
while(put > 0 && sum <= a && poz <= n) {
if(poz + put <= n && sum + v[poz + put] <= a) {
sum += v[poz + put];
poz += put;
}
put = (put >> 1);
}
if(sum == a && poz != 0) {
return poz;
} else {
return -1;
}
}
int main ()
{
re = fopen("aib.in", "r");
we = fopen("aib.out", "w");
int m;
fscanf(re, "%d %d", &n, &m);
int x;
for(int i = 1; i <= n; i++) {
fscanf(re, "%d", &x);
update(i, x);
}
int t, a, b;
for(int i = 0; i < m; i++) {
//printf("OK");
fscanf(re, "%d%d", &t, &a);
if(t == 2) {
fprintf(we, "%d\n", caut(a));
} else {
fscanf(re, "%d", &b);
if(t == 0) {
update(a, b);
} else {
fprintf(we, "%d\n", query(b) - query(a - 1));
}
}
}
fclose(re);
fclose(we);
return 0;
}