Pagini recente » Cod sursa (job #540375) | Cod sursa (job #44748) | Cod sursa (job #2843458) | Cod sursa (job #1734268) | Cod sursa (job #2342847)
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define lsb(x) (x&(-x))
static const int NMAX=1e5+5;
int n,m;
int aib[NMAX];
void Update(int poz, int val)
{
for(int i = poz; i <= n; i+=lsb(i))
{
aib[i]+=val;
}
}
int Query(int x)
{
int sum =0;
for(int i = x; i> 0; i-=lsb(i))
{
sum+=aib[i];
}
return sum;
}
void ReadInput()
{
int x;
fin >> n >> m;
for(int i = 1; i<=n ;++i){
fin >> x;
Update(i, x);
}
}
void Solve()
{
int cer, x, y;
for(int i = 1;i <=m; ++i)
{
fin >> cer;
if(cer ==0)
{
fin >> x >> y;
Update(x,y);
}
else if(cer == 1)
{
fin >> x >> y;
fout << Query(y) - Query(x-1) << '\n';
}
else
{
fin >>x;
int k = 0,pas=1;
for(;pas <= n; pas <<=1);
for(;pas;pas>>=1)
{
if(k+pas <=n)
{
if(aib[k+pas] <= x){
x-=aib[k+pas];
k+=pas;
}
}
}
if(x == 0 && k > 0)
fout << k << '\n';
else
fout << -1 << '\n';
}
}
}
int main()
{
ReadInput();
Solve();
}