Pagini recente » Cod sursa (job #2543372) | Cod sursa (job #1249755) | Cod sursa (job #1527665) | Cod sursa (job #2349552) | Cod sursa (job #905918)
Cod sursa(job #905918)
#include<fstream>
using namespace std;
ofstream g("aib.out");
int n,m,arb[100001],i,x,tip;
void adauga(int poz,int x)
{
int pozbit=0;
while(poz<=n)
{
arb[poz]+=x;
while(!(poz&(1<<pozbit)))
pozbit++;
poz+=(1<<pozbit);
pozbit+=1;
}
}
int raspuns(int poz)
{
int pozbit=0,suma=0;
while(poz>0)
{
suma+=arb[poz];
while(!(poz&(1<<pozbit)))
pozbit++;
poz-=(1<<pozbit);
pozbit+=1;
}
return suma;
}
int cauta(int x)
{
int st,dr,mij,s;
st=1,dr=n;
while(st<=dr)
{
mij=(st+dr)/2;
s=raspuns(mij);
if(s==x)
return mij;
if(s<x)
st=mij+1;
else
dr=mij-1;
}
return -1;
}
int main()
{
ifstream f("aib.in");
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>x;
adauga(i,x);
}
while(m--)
{
f>>tip;
if(tip==0)
{
int x,y;
f>>x>>y;
adauga(x,y);
}
else
if(tip==1)
{
int x,y;
f>>x>>y;
g<<raspuns(y)-raspuns(x-1)<<'\n';
}
else
if(tip==2)
{
int x;
f>>x;
g<<cauta(x)<<'\n';
}
}
return 0;
}