Pagini recente » Cod sursa (job #1953672) | Cod sursa (job #1252583) | Cod sursa (job #1089064) | Cod sursa (job #2734162) | Cod sursa (job #2550537)
#include <bits/stdc++.h>
#define Nmax 100005
using namespace std;
ifstream fin ( "aib.in" );
ofstream fout ( "aib.out" );
typedef long long int LL;
void Read ( );
void Add ( int i, LL val );
LL Querry ( int i, int j );
int Caut ( LL sum );
LL aib[Nmax];
int n, m;
int main ( )
{
Read ( );
}
void Add ( int i, LL val )
{
while ( i <= n )
{
aib[i] += val;
i += (i&(-i));
}
return ;
}
LL Querry ( int i, int j)
{
LL sum1, sum2;
sum1 = sum2 = 0;
while ( j > 0 )
{
sum2 += aib[j];
j -= ( j & (-j) );
}
i--;
while ( i > 0 )
{
sum1 += aib[i];
i-= ( i & (-i) );
}
return sum2-sum1;
}
int Caut ( LL val )
{
int i, step;
for ( step = 1; step < n; step <<= 1 );
for( i = 0; step; step >>= 1 )
{
if( i + step <= n)
{
if( val >= aib[i+step] )
{
i += step, val -= aib[i];
if ( !val ) return i;
}
}
}
return -1;
}
void Read ( )
{
LL a, b, task;
fin >> n >> m;
for ( int i = 1; i <= n; i++ )
{
fin >> a;
Add ( i, a );
}
for ( int i = 1; i <= m; i++ )
{
fin >> task >> a;
if ( task == 0 )
{
fin >> b;
Add ( a, b );
}
else if ( task == 1 )
{
fin >> b;
fout << Querry ( a, b ) << '\n';
}
else
fout << Caut ( a ) << '\n';
}
}