Pagini recente » Cod sursa (job #2707137) | Cod sursa (job #1409267) | Cod sursa (job #140873) | Cod sursa (job #59680) | Cod sursa (job #2550292)
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int NMAX = 100000;
int aib[NMAX+5], n;
///Complexitatea fiecarui update este de O(log n)
void update(int poz, int val)
{
while(poz <=n)
{
aib[poz] = aib[poz] + val;
poz = poz + (poz & (-poz));
}
}
///Complexitatea fiecarui query este de O(log n). Aceasta functie imi va returna suma elemetelor de la 1 la poz.Astfel, query(a, b) = query(b)- query(a-1);
int query(int poz)
{
int s = 0;
while(poz > 0)
{
s = s + aib[poz];
poz = poz - (poz & (-poz));
}
return s;
}
///Pentru cerinta 2, avand in vedere ca numerele sunt toate pozitive si nu pot deveni negative in urma update-urilor, putem sa ne folosim de cautarea binara
///deoarece sumele vor fi astfel in ordine crescatoare.
int cautare_binara(int val, int st, int dr)
{
int mid, suma;
while(st<=dr)
{
mid = (st + dr) >>1;
suma = query(mid);
if(suma == val)
return mid;
if(suma < val)
st = mid + 1;
else
dr = mid -1;
}
return -1;
}
int main()
{
int m, x, i, a, b, t;
fin>>n>>m;
for(i=1;i<=n;i++)
{
fin>>x;
update(i, x);
}
for(i=1;i<=m;i++)
{
fin>>t;
if(t == 0)
{
fin>>a>>b;
update(a, b);
continue;
}
if(t == 1)
{
fin>>a>>b;
fout<<query(b) - query(a-1)<<"\n";
continue;
}
if(t == 2)
{
fin>>a;
fout<<cautare_binara(a, 1, n)<<"\n";
}
}
return 0;
}