Pagini recente » Cod sursa (job #1437882) | Cod sursa (job #2146616) | Monitorul de evaluare | Cod sursa (job #2158225) | Cod sursa (job #1449485)
#include<fstream>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int n, m, t, a, b, AIB[100003];
inline int zero(int x)
{
return x & (-x);
}
void Update(int poz, int val)
{
for(; poz <= n; poz += zero(poz))
AIB[poz] += val;
}
int Query(int poz)
{
int s = 0;
for(; poz; poz -= zero(poz))
s += AIB[poz];
return s;
}
int Search(int val)
{
int i, log;
for(log = 1; log < n; log <<= 1);
for(i=0; log; log >>= 1)
if(i + log <= n and val >= AIB[i + log])
{
i += log;
val -= AIB[i];
if(!val) return i;
}
return -1;
}
int main()
{
in >> n >> m;
for(int i = 1; i <= n; i++)
{
in >> a;
Update(i, a);
}
while(m--)
{
in >> t;
if(t == 0)
{
in >> a >> b;
Update(a, b);
}
else if(t == 1)
{
in >> a >> b;
out << Query(b) - Query(a - 1) << '\n';
}
else
{
in >> a;
out << Search(a) << '\n';
}
}
out.close();
return 0;
}