Pagini recente » Cod sursa (job #181025) | Cod sursa (job #1501837) | Cod sursa (job #2404472) | Cod sursa (job #834421) | Cod sursa (job #1133983)
#include <iostream>
#include<stdio.h>
using namespace std;
FILE *f,*g;
long long v[100000];
int q=1,N,M,j,a,b,curr;
long long s;
void update(void)
{
j=a+q;
while(j>0) {v[j]+=b;j/=2;}
}
void sum(void)
{
a+=q;b+=q;
if (a==b) fprintf(g,"%lld\n",v[a]);
else
{
s=v[a]+v[b];
while(a/2!=b/2)
{
if (a%2==0) s+=v[a+1];
if(b%2==1) s+=v[b-1];
a/=2;b/=2;
}
fprintf(g,"%lld\n",s);
}
}
void query(void)
{
curr=1;
while(v[curr]!=a&&curr*2<=N+q)
{
if (v[curr*2]>=a) curr*=2;
else
{
a=a-v[curr*2];
curr=curr*2+1;
}
}
if (v[curr]==a) {while((curr*2+1)<=N+q) curr=curr*2+1;if (curr>q) fprintf(g,"%d\n",curr-q); else fprintf(g,"%d",N);}
else {fprintf(g,"-1\n");}
}
int main()
{
int x,i;
f=fopen("aib.in","r");
g=fopen("aib.out","w");
fscanf(f,"%d%d",&N,&M);
while (q<N) q*=2;
q--;
for(a=1;a<=N;a++) {fscanf(f,"%d",&b);update();}
for(i=1;i<=M;i++)
{
fscanf(f,"%d",&x);
if (x==0) {fscanf(f,"%d%d",&a,&b);update();}
if (x==1) {fscanf(f,"%d%d",&a,&b);sum();}
if (x==2) {fscanf(f,"%d",&a); query();}
}
return 0;
}