Pagini recente » Cod sursa (job #690339) | Cod sursa (job #324868) | Cod sursa (job #86036) | Cod sursa (job #587590) | Cod sursa (job #1235200)
#include<cstdio>
using namespace std;
#define MAX 100001
int N , AIB[MAX] , Q;
void update(int a , int b);
int query(int a);
int search (int s);
int main()
{
int t , a, b ;
freopen("aib.in" , "r" , stdin );
freopen("aib.out" , "w" , stdout );
scanf("%d%d" , &N , &Q );
for(int i = 1 ; i <= N ; ++i )
{
scanf("%d" , &t);
update(i,t);
}
for(int i = 1 ; i <= Q ; ++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" , search(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 k = 0 , s = 0;
while(a)
{
s += AIB[a];
while(!(a&(1<<k)))k++;
a-=(1<<k);
}
return s;
}
int search (int s)
{
int ls = 1 , ld = N , mijl ;
while(ls <= ld )
{
mijl = (ls+ld)/2;
int r = query(mijl);
if(r == s)return mijl;
else
if(r < s)ls = mijl + 1;
else ld = mijl-1;
}
return -1;
}