Pagini recente » Cod sursa (job #2404642) | Cod sursa (job #1596504) | Cod sursa (job #699617) | Cod sursa (job #1428854) | Cod sursa (job #1609335)
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");
int c[100005], M, n;
void Update(int i, int x)
{
while (i <= n)
{
c[i] += x;
i = i + (i & (-i));
}
}
int Query(int i)
{
int s;
s = 0;
while (i > 0)
{
s += c[i];
i = i - (i & (-i));
}
return s;
}
int Pozitie(int a)
{
int st, dr, sol, mij, suma;
st = 1; dr = n;
sol = -1;
while (st <= dr)
{
mij = (st + dr ) / 2;
suma = Query(mij);
if (suma == a) { sol = mij; dr = mij - 1; }
else if (suma > a) dr = mij - 1;
else st = mij + 1;
}
return sol;
}
void Citire()
{
int x;
fin >> n >> M;
for (int i = 1; i <= n; ++i)
{
fin >> x;
Update(i, x);
}
}
void Rezolva()
{
int cod, x, y, poz;
for (int i = 1; i<=M; i++)
{
fin >> cod;
if (cod == 0)
{
fin >> poz >> x;
Update(poz, x);
}
else
if (cod == 1)
{
fin >> x >> y;
fout << Query(y) - Query(x-1) << "\n";
}
else
{
fin >> x;
fout << Pozitie(x) << "\n";
}
}
}
int main ()
{
Citire();
Rezolva();
fin.close();
fout.close();
return 0;
}