Pagini recente » Cod sursa (job #1585162) | Cod sursa (job #1728432) | Cod sursa (job #1423992) | Cod sursa (job #1362220) | Cod sursa (job #2414973)
#include <stdio.h>
#define it(x) x&(-x)
#define NMAX 100005
using namespace std;
FILE *fin = fopen("aib.in", "r");
FILE *fout = fopen("aib.out", "w");
int n,cerinta,q,a,b,i,x,aib[NMAX];
void update(int poz, int x)
{
for(int i=poz; i<=n; i+=it(i))
aib[i] += x;
}
int sum(int poz)
{
int ans = 0;
for(int i=poz; i>=1; i-=it(i))
ans += aib[i];
return ans;
}
int cauta(int a)
{
int poz = -1;
int left = 1;
int right = n, mid;
while(left <= right)
{
mid = (left+right) /2;
if(sum(mid) >= a)
{
if(sum(mid) == a)
poz = mid;
right = mid-1;
}
else
left = mid+1;
}
return poz;
}
int main()
{
fscanf(fin, "%d%d", &n,&q);
for(i=1; i<=n; ++i)
{
fscanf(fin, "%d", &x);
update(i,x);
}
while(q)
{
fscanf(fin, "%d", &cerinta);
if(cerinta == 0 or cerinta == 1)
{
fscanf(fin, "%d%d", &a,&b);
if(!cerinta)
update(a, b);
else
fprintf(fout, "%d\n", sum(b)-sum(a-1));
}
else
{
fscanf(fin, "%d", &a);
fprintf(fout, "%d\n", cauta(a));
}
--q;
}
fclose(fin);
fclose(fout);
return 0;
}