Pagini recente » Cod sursa (job #903374) | Cod sursa (job #1275039) | Cod sursa (job #1583295) | Cod sursa (job #61576) | Cod sursa (job #872220)
Cod sursa(job #872220)
#include <stdio.h>
//Constante
const int sz = (int)1e5+1;
//Functii
int query(int pos);
int search(int val);
void update(int pos, int val);
//Variabile
FILE *in,*out;
int elements,questions;
int tree[sz];
int main()
{
in=fopen("aib.in","rt");
out=fopen("aib.out","wt");
fscanf(in,"%d%d",&elements,&questions);
for(int i=1; i<=elements; ++i)
{
int value;
fscanf(in,"%d",&value);
update(i, value);
}
while(questions--)
{
int type, rLeft, rRight, value, position;
fscanf(in, "%d",&type);
if(type)
{
if(type==1)
{
fscanf(in,"%d%d",&rLeft,&rRight);
fprintf(out,"%d\n",query(rRight) - query(rLeft-1));
}
else
{
fscanf(in,"%d",&value);
fprintf(out,"%d\n",search(value));
}
}
else
{
fscanf(in,"%d%d",&position, &value);
update(position,value);
}
}
fclose(in);
fclose(out);
return 0;
}
void update(int pos, int val)
{
int power = 0;
while(pos <= elements)
{
tree[pos] += val;
while(!(1<<power & pos))
++power;
pos += (1<<power);
}
}
int query(int pos)
{
int power = 0;
int sum = 0;
while(pos)
{
sum += tree[pos];
while(!(1<<power & pos))
++power;
pos -= (1<<power);
}
return sum;
}
int search(int val)
{
int left = 1, right = elements;
while(left <= right)
{
int mid = (left+right) >>1;
int sum = query(mid);
if(sum == val)
return mid;
if(val < sum)
right = mid -1 ;
else left = mid + 1;
}
return -1;
}