Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Profil ender | Monitorul de evaluare | Cod sursa (job #641330)
Cod sursa(job #641330)
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int arb[100001] , N , M , C , S ;
void update(int poz,int val)
{
C = 0;
while(C <= N)
{
arb[poz]+=val;
while ( !(poz & (1<<C)) ) C++;
poz+=(1<<C);
C+=1;
}
}
int query(int poz)
{
S = 0 , C = 0 ;
while(poz > 0)
{
S += arb[poz];
while ( !(poz & (1<<C)) ) C++;
poz-=(1<<C);
C+=1;
}
return S;
}
int search(int val)
{
int steps = 1;
for(;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;
}