Pagini recente » Cod sursa (job #83802) | Cod sursa (job #102537) | Cod sursa (job #276853) | Clasament aparitii_sir | Cod sursa (job #764169)
Cod sursa(job #764169)
#include<stdio.h>
unsigned int bit[100001];
int n;
int nextIndex(int index)
{
unsigned int i;
for(i = 0; !((1 << i) & index); i++);
return (1 << i);
}
void add(int index, unsigned int value)
{
while(index <= n)
{
bit[index] += value;
index += nextIndex(index);
}
}
unsigned int querry(int l, int r)
{
unsigned int valueL = 0, valueR = 0;
l = l - 1;
while(r > 0)
{
valueR += bit[r];
r -= nextIndex(r);
}
while(l > 0)
{
valueL += bit[l];
l -= nextIndex(l);
}
return valueR - valueL;
}
int find(unsigned int value)
{
int l = 1, r = n, middle;
unsigned int sum;
while(l <= r)
{
middle = (r - l) / 2 + l;
sum = querry(1, middle);
if(sum == value)
return middle;
if(sum < value)
l = middle + 1;
else
r = middle - 1;
}
return -1;
}
int main()
{
FILE *in = fopen("aib.in", "r");
FILE *out = fopen("aib.out", "w");
unsigned int m, a, b;
int op, i, j;
fscanf(in, "%d %d", &n, &m);
for(i = 1; i <= n; i++)
{
fscanf(in, "%d", &a);
add(i, a);
}
for(; m; m--)
{
fscanf(in, "%d", &op);
switch(op)
{
case 0:
fscanf(in, "%d %d", &i, &b);
add(i, b);
break;
case 1:
fscanf(in, "%d %d", &i, &j);
fprintf(out, "%d\n", querry(i, j));
break;
default:
fscanf(in, "%d", &a);
fprintf(out, "%d\n", find(a));
}
}
fclose(in);
fclose(out);
return 0;
}