Pagini recente » Cod sursa (job #746087) | Cod sursa (job #1884643) | Cod sursa (job #1710993) | Cod sursa (job #1543338) | Cod sursa (job #3138001)
#include <fstream>
using namespace std;
ifstream cin ("aib.in");
ofstream cout ("aib.out");
int lungime , suma[100001];
void Update (const int pozitie , const int valoare)
{
for (int indice = pozitie ; indice <= lungime ; indice += (indice & -indice))
suma[indice] += valoare;
}
int Suma (const int dreapta)
{
int rezultat = 0;
for (int indice = dreapta ; indice ; indice -= (indice & -indice))
rezultat += suma[indice];
return rezultat;
}
int main ()
{
int operatii;
cin >> lungime >> operatii;
for (int ordine = 1 , numar ; ordine <= lungime ; ordine++)
{
cin >> numar;
for (int indice = ordine ; indice <= lungime ; indice += (indice & -indice))
suma[indice] += numar;
}
for (int operatie = 1 , tip , pozitie_stanga , valoare_dreapta ; operatie <= operatii ; operatie++)
{
cin >> tip >> pozitie_stanga;
if (tip == 0 || tip == 1)
{
cin >> valoare_dreapta;
if (tip == 0)
Update(pozitie_stanga , valoare_dreapta);
else
cout << Suma(valoare_dreapta) - Suma(pozitie_stanga - 1) << '\n';
}
else
{
int stanga = 1 , dreapta = lungime , pozitie = -1;
while (stanga <= dreapta)
{
const int mijloc = ((stanga + dreapta) >> 1) , suma = Suma(mijloc);
if (suma == pozitie_stanga)
dreapta = mijloc - 1 , pozitie = mijloc;
else
if (suma > pozitie_stanga)
dreapta = mijloc - 1;
else
stanga = mijloc + 1;
}
cout << pozitie << '\n';
}
}
cout.close(); cin.close();
return 0;
}