Pagini recente » Cod sursa (job #1687195) | Cod sursa (job #3291338) | Cod sursa (job #1113730) | Cod sursa (job #2195026) | Cod sursa (job #1760978)
#include <iostream>
#include <cstdio>
using namespace std;
int n,m,sume[100005];
int aflare(int x, int y)
{
int sum = 0;
while(y > 0)
{
sum += sume[y];
y -= ((y ^ (y - 1)) & y);
}
return sum;
}
void max_interval(int x, int y)
{
printf("%d\n",aflare(1,y) - aflare(1,x - 1));
}
int binar(int sum_max)
{
int st = 1, dr = n;
while( st <= dr )
{
int mij = (st + dr) / 2;
int tmp = aflare (1,mij);
if(tmp == sum_max)
{
return mij;
}
else if(tmp < sum_max)
{
st = mij + 1;
}
else
{
dr = mij - 1;
}
}
}
void aduna(int poz, int x)
{
while(poz <= n)
{
sume[poz] += x;
poz += ((poz ^ (poz - 1)) & poz);
}
}
void citire()
{
scanf("%d %d\n",&n,&m);
int tmp;
for(int i = 1 ; i <= n ; ++i)
{
scanf("%d ",&tmp);
aduna(i,tmp);
}
int a,b;
for(int i = 1 ; i <= m ; ++i)
{
scanf("%d ",&tmp);
if(tmp == 0)
{
scanf("%d %d\n",&a,&b);
aduna(a,b);
continue;
}
if(tmp == 1)
{
scanf("%d %d\n",&a,&b);
max_interval(a,b);
continue;
}
if(tmp == 2)
{
scanf("%d\n",&a);
printf("%d\n",binar(a));
continue;
}
}
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
citire();
return 0;
}