Pagini recente » Istoria paginii runda/utcn_2021_preselectie/clasament | Cod sursa (job #118314) | Istoria paginii runda/speed_noapte | Cod sursa (job #1549433) | Cod sursa (job #2023429)
#include <iostream>
#include <fstream>
#define lsb(x) (x&(-x))
#define DM 100005
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int n, m, aib[DM];
void adg( int sant, int value )
{
for( int i = sant; i <= n; i += lsb(i))
{
aib[i] += value;
}
}
int interval( int d )
{
int result = 0;
for( int i = d; i > 0; i -= lsb(i))
{
result += aib[i];
}
return result;
}
int cb( int suma )
{
int left = 0, right = n + 1, mid;
while( right - left > 1)
{
mid = (left + right)/2;
if(interval( mid ) <= suma) left = mid;
else right = mid;
}
if( left == n + 1 || interval( left ) != suma || !left)
return -1;
return left;
}
int a, b;
int main()
{
int ax;
fin >> n >> m;
for( int i = 1 ; i <= n; i++)
fin >> ax, adg( i, ax );
for( int i = 1; i <= m; i++)
{
fin >> ax;
if( ax == 0 )
{
fin >> a >> b;
adg(a, b);
}
else if( ax == 1)
{
fin >> a >> b;
fout << interval(b) - interval(a - 1)<<"\n";
}
else
{
fin >> a;
fout << cb(a) << "\n";
}
}
return 0;
}