Pagini recente » Cod sursa (job #1562371) | Cod sursa (job #2364545) | Cod sursa (job #2629971) | Cod sursa (job #2000170) | Cod sursa (job #1342379)
#include<stdio.h>
#include<algorithm>
using namespace std;
FILE *in, *out;
//definitions
//constants
const int sz = (int) 1e5+1;
//variables
int n, quest;
int val, pos;
int tree[sz];
int type;
int left, right;
//functions
void update(int value, int position);
int query(int position);
int search (int value);
int main(void)
{
in = fopen("aib.in","rt");
out = fopen("aib.out","wt");
fscanf(in, "%d%d" ,&n, &quest);
for(int i=1; i<=n; ++i)
{
fscanf(in, "%d", &val);
update(val, i);
}
while(quest--)
{
fscanf(in, "%d", &type);
if(type)
{
if(type==1)
{
fscanf(in, "%d%d", &left, &right);
fprintf(out, "%d\n",query(right)-query(left-1));
}
else
{
fscanf(in, "%d", &val);
fprintf(out, "%d\n", search(val));
}
}
else
{
fscanf(in, "%d%d", &pos, &val);
update(val, pos);
}
}
fclose(in);
fclose(out);
return 0;
}
void update(int value, int position)
{
int power = 0;
while( position <= n)
{
while(! ((1<<power) & position))
power++;
tree[position] += value;
position += (1<<power);
}
}
int query(int position)
{
int power = 0;
int sum = 0;
while( position )
{
while( !((1<<power) & position))
power ++;
sum += tree[position];
position -= (1<<power);
}
return sum;
}
int search(int value)
{
int left = 1;
int right = n;
while( left <= right)
{
int mid = (left+right) / 2;
int sum = query(mid);
if(sum == value)
return mid;
else
if(value < sum)
right = mid-1;
else
left = mid+1;
}
return -1;
}