Pagini recente » Cod sursa (job #430398) | Cod sursa (job #3151739) | Cod sursa (job #2593999) | Cod sursa (job #2951688) | Cod sursa (job #1117185)
#include<cstdio>
using namespace std;
#define MAX 100001
int N , M , AIB[MAX];
int query(int x);
int bin(int x);
void update(int x , int y);
int main()
{
int t ,a ,b;
freopen("aib.in" , "r" , stdin );
freopen("aib.out" , "w" , stdout );
scanf("%d%d" , &N , &M );
for(int i = 1 ; i<= N ; ++i )
{
scanf("%d" , &a);
update(i,a);
}
for(int i = 1 ; i<= M ; ++i )
{
scanf("%d" , &t );
if(t == 0)
{
scanf("%d%d" , &a , &b);
update(a,b);
}
if(t == 1)
{
scanf("%d%d" , &a , &b );
printf("%d\n" , query(b)-query(a-1));
}
if(t == 2)
{
scanf("%d" , &a);
printf("%d\n" , bin(a));
}
}
return 0;
}
void update(int a , int b)
{
int k = 0;
while(a <= N)
{
AIB[a] += b;
while(!(a&(1<<k)))k++;
a+=(1<<k);
}
}
int query(int a)
{
int s = 0,k = 0;
while(a > 0)
{
s+=AIB[a];
while(!(a&(1<<k)))k++;
a-=(1<<k);
}
return s;
}
int bin(int a)
{
int ls = 1 , ld = N , m , t;
while(ls <= ld)
{
m = (ls+ld)/2;
t = query(m);
if(a == t)return m;
else
if(a < t)
ld = m-1;
else
ls = m+1;
}
return -1;
}