Pagini recente » Cod sursa (job #199211) | Cod sursa (job #54270) | Cod sursa (job #3233033) | Cod sursa (job #684610) | Cod sursa (job #2908388)
#include <fstream>
using namespace std;
const int N = 1e5;
const int L = 16;
int n, aib[N+1];
void actualizare(int p, int val)
{
while (p <= n)
{
aib[p] += val;
int ultima = (p & (-p));
p += ultima;
}
}
int interogare(int p)
{
int sum = 0;
while (p > 0)
{
sum += aib[p];
int ultima = (p & (-p));
p -= ultima;
}
return sum;
}
int interogare_2(int val)
{
int rez = 0, pas = 1 << L;
while (pas != 0)
{
if (rez + pas <= n && interogare(rez + pas) < val)
{
rez += pas;
}
pas /= 2;
}
if (rez == n || interogare(rez + 1) != val)
{
return -1;
}
return rez + 1;
}
int main()
{
ifstream in("aib.in");
ofstream out("aib.out");
int nq;
in >> n >> nq;
for (int i = 1; i <= n; i++)
{
int val;
in >> val;
actualizare(i, val);
}
for (int i = 0; i < nq; i++)
{
int tip;
in >> tip;
if (tip == 0)
{
int poz, val;
in >> poz >> val;
actualizare(poz, val);
}
else if (tip == 1)
{
int st, dr;
in>> st >> dr;
out << interogare(dr) - interogare(st - 1) << "\n";
}
else
{
int val;
in >> val;
out << interogare_2(val) << "\n";
}
}
return 0;
}