Pagini recente » Cod sursa (job #2298764) | Cod sursa (job #1979366) | Cod sursa (job #2843683) | Cod sursa (job #208670) | Cod sursa (job #2553313)
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n, m, i, j;
int tip, x, suma;
int poz, val;
int ST, DR;
int a, b, mij, k;
int s[262144];
void update(int nod, int st, int dr)
{
if (st == dr)
{
s[nod] += val;
return;
}
int mij = (st + dr) / 2;
if (poz <= mij)
update(nod*2, st, mij);
else
update(nod*2+1, mij+1, dr);
s[nod] = s[nod*2] + s[nod*2+1];
}
void query(int nod, int st, int dr)
{
if (ST <= st && dr <= DR)
{
suma += s[nod];
return;
}
int mij = (st + dr) / 2;
if (mij >= ST)
query(nod*2, st, mij);
if (mij < DR)
query(nod*2+1, mij+1, dr);
}
int main()
{
f >> n >> m;
for (i=1; i<=n; i++)
{
f >> x;
poz = i, val = x;
update(1, 1, n);
}
for (i=1; i<=m; i++)
{
f >> tip;
if (tip == 0)
{
f >> a >> b;
poz = a, val = b;
update(1, 1, n);
}
else if (tip == 1)
{
f >> a >> b;
suma = 0;
ST = a, DR = b;
query(1, 1, n);
g << suma << "\n";
}
else
{
f >> val;
a = 1, b = n, k = -1;
while (a <= b)
{
mij = (a + b) / 2;
ST = 1, DR = mij;
suma = 0;
query(1, 1, n);
if (suma == val)
{
k = mij;
b = mij - 1;
}
else if (suma < val)
a = mij + 1;
else
b = mij - 1;
}
g << k << "\n";
}
}
return 0;
}