Pagini recente » Cod sursa (job #2838028) | Utilizatori inregistrati la PreOJI 2017 | Cod sursa (job #2442680) | Cod sursa (job #1415507) | Cod sursa (job #2755652)
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <stdio.h>
//std::ifstream in("aib.in");
//std::ofstream out("aib.out");
FILE *fin, *fout;
const int N=100000;
int v[N+1];
int AIB[N+2];
int parent(int i)
{
return i-(i&(-i));
}
int frate_vecin(int i)
{
return i+(i&(-i));
}
void update(int poz, int dif, int n)
{
v[poz]+=dif;
int casuta=poz+1;
while(casuta<=n+1)
{
AIB[casuta]+=dif;
casuta=frate_vecin(casuta);
}
}
int sum(int poz)
{
int s=0;
int casuta=poz+1;
while(casuta!=0)
{
s+=AIB[casuta];
casuta=parent(casuta);
}
return s;
}
int interogare(int suma, int n)
{
int st=1, dr=n+1, mij, k;
while(st+1!=dr)
{
mij=(st+dr)/2;
if(sum(mij)<suma)
{
st=mij+1;
}
else
{
dr=mij;
}
}
if(sum(st)!=suma) return -1;
return st;
}
int main()
{
fin=fopen("aib.in", "r");
fout=fopen("aib.out", "w");
int n, m, x, l, r;
fscanf(fin, "%d%d", &n, &m);
for(int i=1; i<=n; i++)
{
fscanf(fin, "%d", &x);
update(i, x, n);
}
for(int i=1; i<=m; i++)
{
fscanf(fin, "%d", &x);
switch(x)
{
case 0:
fscanf(fin, "%d%d", &l, &r);
update(l, r, n);
break;
case 1:
fscanf(fin, "%d%d", &l, &r);
fprintf(fout, "%d\n", sum(r)-sum(l-1));
break;
case 2:
fscanf(fin, "%d", &x);
fprintf(fout, "%d\n", interogare(x, n));
break;
}
}
}