Pagini recente » Cod sursa (job #166766) | Cod sursa (job #1877768) | Cod sursa (job #2716874)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("aib.in");
ofstream g ("aib.out");
int n,c,x,q;
int s[100001];
int aflare_nr_de_adunat(int nr)
{
return nr & (-nr);
}
void add(int nr,int indice)
{
if(indice>n)
return;
s[indice] += nr;
int nr_de_adunat = aflare_nr_de_adunat(indice);
add(nr,indice+ nr_de_adunat);
}
int suma(int poz)
{
int sum = 0;
while(poz>=1)
{
sum +=s[poz];
poz-=aflare_nr_de_adunat(poz);
}
return sum;
}
int cb(int sum)
{
int st = 1,dr = n,mij,rasp = -1;
while(st<=dr)
{
mij = (st+dr)/2;
int suma_calc = suma(mij);
if(suma_calc == sum)
{
rasp = mij;
dr = mij - 1;
}
else if(suma_calc>sum)
{
dr = mij - 1;
}
else
{
st = mij +1;
}
}
return rasp;
}
int main()
{
f >> n>>q;
for(int i = 1; i<=n; i++)
{
f >> x;
add(x,i);
}
for(int i = 1; i<=q; i++)
{
f >> c;
if(c == 0)
{
int a,b;
f >> a >> b;
add(b,a);
}
else if(c == 1)
{
int a,b;
f >> a >> b;
int suma_b = suma(b);
int suma_a = suma(a-1);
g << suma_b - suma_a<< '\n';
}
else if(c == 2)
{
int x;
f >> x;
g << cb(x)<< '\n';
}
}
}