Pagini recente » Cod sursa (job #1841446) | Cod sursa (job #1635245) | Cod sursa (job #105317) | Cod sursa (job #703159) | Cod sursa (job #641324)
Cod sursa(job #641324)
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int arb[100001] , N , M;
void update(int poz,int val)
{
for(int C = 0;C<=N;)
{
arb[poz]+=val;
while(!(poz & (1<<C))) C++;
poz+=(1<<C);
C++;
}
}
int query(int poz)
{
int S = 0;
for(int C = 0;poz > 0;)
{
S += arb[poz];
while(!(poz & (1<<C))) C++;
poz-=(1<<C);
C++;
}
return S;
}
int search(int val)
{
int steps;
for(steps = 1;steps < N;steps<<=1);
for(int i = 0;steps;steps>>=1)
{
if(i + steps<=N)
{
if(val >= arb[i+steps])
{
i += steps , val -= arb[i];
if(!val) return i;
}
}
}
return -1;
}
int main()
{
int tip , x , y ;
fin>>N>>M;
for(int i=1;i<=N;++i)
fin>>x , update(i,x);
for(;M;M--)
{
fin>>tip;
if(tip == 2)
{
fin>>x;
fout<<search(x)<<'\n';
}
else
{
fin>>x>>y;
if(tip == 0) update(x,y);
else
fout<<query(y) - query(x-1)<<'\n';
}
}
return 0;
}