Pagini recente » Cod sursa (job #2757033) | Cod sursa (job #914892) | Cod sursa (job #2226846) | Cod sursa (job #418033) | Cod sursa (job #2484828)
#include <fstream>
#include <iostream>
#define NMAX 100000
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n, q, maxBit, aib[NMAX+10];
void update(int poz, int val)
{
while(poz <= n)
{ aib[poz] += val;
int lastBit = poz & (-poz);
poz += lastBit;
}
}
int query(int poz)
{
int sol = 0;
while(poz)
{ sol += aib[poz];
int lastBit = poz & (-poz);
poz -= lastBit;
}
return sol;
}
int binSearch(int val)
{
int bitMask = maxBit, poz = 0;
while(bitMask > 0)
{ int mij = poz + bitMask;
bitMask = bitMask >> 1;
if(mij <= n)
{ if(aib[mij] <= val)
{ poz = mij;
val -= aib[mij];
}
}
}
if(val) return -1;
return poz;
}
int main()
{
f >> n >> q;
for(int i=0; i<=18; i++) if((1 << i) & n) maxBit = 1 << i;
for(int i=1; i<=n; i++)
{ int x;
f >> x;
update(i, x);
}
while(q--)
{ int type;
f >> type;
if(!type)
{ int a, b;
f >> a >> b;
update(a, b);
}
else if(type == 1)
{ int a, b;
f >> a >> b;
g << query(b) - query(a-1) << '\n';
}
else
{ int a;
f >> a;
if(!a) g << -1 << '\n';
else g << binSearch(a) << '\n';
}
}
return 0;
}