Pagini recente » Cod sursa (job #443822) | Cod sursa (job #1564035) | Cod sursa (job #1311981) | Cod sursa (job #3134134) | Cod sursa (job #1092696)
#include<cstdio>
#include<algorithm>
using namespace std ;
#define maxn 100001
int N, M ;
int aib[maxn] ;
bool sel[maxn] ;
void update(int ind, int val)
{
while( ind <= N )
{
aib[ind] += val ;
ind += ( ind & ( -ind ) ) ;
}
}
int suma(int ind)
{
int x = 0 ;
while( ind )
{
x += aib[ind] ;
ind -= ( ind & (-ind) ) ;
}
return x ;
}
int query(int val)
{
if( aib[1] > val )
return -1 ;
int ind = 1 ;
int ad = (1 << 15) ;
while( ad )
{
if( ind + ad > N )
{
ad >>= 1 ;
continue ;
}
int V = suma(ind + ad) ;
if( V == val )
return ind + ad ;
if( V < val )
ind += ad ;
ad >>= 1 ;
}
if( suma(ind) == val )
return ind ;
return -1 ;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d%d", &N, &M);
for(int i = 1; i <= N; ++i )
{
int x ;
scanf("%d", &x);
update( i, x ) ;
}
for(int i = 1; i <= M; ++i )
{
int op ;
scanf("%d", &op);
if( op == 0 )
{
int a, b ;
scanf("%d%d", &a, &b);
update( a, b ) ;
}
if( op == 1 )
{
int a, b ;
scanf("%d%d", &a, &b);
printf("%d\n", suma(b) - suma(a - 1));
}
if( op == 2 )
{
int a ;
scanf("%d", &a);
printf("%d\n", query(a));
}
}
return 0 ;
}