Pagini recente » Cod sursa (job #2078887) | Cod sursa (job #1159391) | Cod sursa (job #2335712) | Cod sursa (job #1053180) | Cod sursa (job #943449)
Cod sursa(job #943449)
#include <fstream>
using namespace std;
int a[100005], n, m;
ofstream cout("aib.out");
void adauga(int poz, int val)
{
while(poz<=n)
{
a[poz]+=val;
poz += (poz^(poz-1)) & poz ;
}
}
int cat(int poz)
{
int sum=0;
while(poz>0)
{
sum += a[poz];
poz -= (poz^(poz-1)) & poz ;
}
return sum;
}
int caut_binar(int val){
int li = 1, ls = n, x, gasit = -1;
while (li <= ls){
x = (li+ls) / 2;
int aa = cat(x);
if (aa >= val){
if (aa == val)
gasit = x;
ls = x-1;
}
else
li = x+1;
}
return gasit;
}
void caut_bin(int val, int li, int ls)
{
int mij=(li+ls)/2;
int aa = cat( mij );
if( li >= ls)
{cout<<"-1\n"; return ;}
if(aa == val)
{cout<<mij<<'\n'; return ; }
else if( aa > mij )
caut_bin(val, li, mij-1);
else caut_bin(val, mij+1, ls);
}
int main()
{
ifstream cin("aib.in");
cin>>n>>m;
for(int i = 1; i <= n ; ++ i)
{
int x;
cin>>x;
adauga(i, x);
}
for(int i = 1 ; i <= m ; ++ i)
{
int tip;
cin>>tip;
if(tip == 0)
{
int pozi, valo;
cin>>pozi>>valo;
adauga(pozi, valo);
}
else if(tip == 1)
{
int first, second;
cin>>first>>second;
cout<<cat(second)-cat(first-1)<<'\n';
}
else if(tip == 2)
{
int value;
cin>>value;
cout<<caut_binar(value)<<"\n";
}
}
return 0;
}