Pagini recente » Monitorul de evaluare | Atasamentele paginii test0000001 | Profil M@2Te4i | Cod sursa (job #672057) | Cod sursa (job #767598)
Cod sursa(job #767598)
#include<fstream>
#define NN 100001
using namespace std;
ofstream out("aib.out");
int n,m,arb[NN];
void read();
int raspuns( int pozitie );
void adauda(int pozitie,int element);
int cauta(int element);
int main()
{
read();
return 0;
}
void adauga(int pozitie,int element)
{
int pozbit=0;
while(pozitie <= n)
{
arb[pozitie] += element;
while(!(pozitie & (1<<pozbit) ) )
pozbit++;
pozitie+= (1<<pozbit);
pozbit+=1;
}
}
int raspuns(int pozitie)
{
int pozbit=0,suma=0;
while(pozitie > 0 )
{
suma+=arb[pozitie];
while(!(pozitie & (1<<pozbit) ) )
pozbit++;
pozitie-= (1<<pozbit);
pozbit+=1;
}
return suma;
}
int cauta(int element)
{
int st,dr;
st=1,dr=n;
int s;
while(st<=dr)
{
int middle=(st+dr)/2;
s=raspuns(middle);
if(s==element)
return middle;
if(s<element)
st=middle+1;
else
dr=middle-1;
}
return -1;
}
void read()
{
ifstream in("aib.in");
in>>n>>m;
for(int x,i=1;i<=n;i++)
{
in>>x;
adauga(i,x);
}
for(int tip;m;--m)
{
in>>tip;
if(tip==0)
{
int x,y;
in>>x>>y;
adauga(x,y);
}
else
if(tip==1)
{
int x,y;
in>>x>>y;
out<<raspuns(y)- raspuns (x-1)<<'\n';
}
else
if(tip==2)
{
int x;
in>>x;
out<<cauta(x)<<'\n';
}
}
}