Pagini recente » Borderou de evaluare (job #2960365) | Borderou de evaluare (job #2122992) | Borderou de evaluare (job #1398086) | Borderou de evaluare (job #128967) | Cod sursa (job #1542412)
#include <iostream>
#include <fstream>
#define nmax 100005
using namespace std;
int AIB[nmax], n, m;
inline int last_bit(int x)
{
return x & (-x);
///sau i - (i & (i-1))
}
void update(int poz, int val)
{
for(int i=poz; i<=n; i= i+last_bit(i))
{
AIB[i]+=val;
}
return;
}
int querry(int poz)
{
int sum=0;
for(int i=poz; i>=1; i = i-last_bit(i))
{
sum+=AIB[i];
}
return sum;
}
int cb(int k)
{
int st=0, dr=n+1, mid;
while(dr - st > 1)
{
mid = (st+dr)/2;
if (k <= querry(mid)) dr = mid;
else st = mid;
}
if(querry(dr) == k)
return dr;
return -1;
}
int main()
{
ifstream f("aib.in");
ofstream g("aib.out");
int act, x, y;
f >> n >> m;
for(int i=1; i<=n; i++)
{
f >> x;
update(i, x);
}
for(int i=1; i<=m; i++)
{
f >> act;
if (act == 0)
{
f >> x >> y;
update(x, y);
}else
if (act == 1)
{
f >> x >> y;
g << querry(y)- querry(x-1) << "\n";
}
else{
f >> x;
g << cb(x) << "\n";
}
}
f.close();
g.close();
return 0;
}