Pagini recente » Cod sursa (job #1700003) | Cod sursa (job #643583) | Profil Djok | Cod sursa (job #2366831) | Cod sursa (job #2969405)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
struct nod{
int value,left_bound,right_bound;
nod *left_child,*right_child;
};
int n,ar[1000005],m;
nod* create_nod(int *v,int left_bound,int right_bound)
{
nod *q=new nod;
q->left_bound=left_bound;
q->right_bound=right_bound;
if(right_bound==left_bound)
{
q->value=ar[left_bound];
q->left_child=NULL;
q->right_child=NULL;
return q;
}
int mij=(left_bound+right_bound)/2;
q->left_child=create_nod(v,left_bound,mij);
q->right_child=create_nod(v,mij+1,right_bound);
q->value=q->left_child->value+q->right_child->value;
return q;
}
void free_nod(nod *r)
{
if(r==NULL)
return;
free_nod(r->left_child);
free_nod(r->right_child);
delete r;
}
void update(nod *r,int pos,int val)
{
if(pos<r->left_bound || pos>r->right_bound)
return;
if(r->left_bound==r->right_bound)
{
r->value=val+r->value;
return;
}
update(r->left_child,pos,val);
update(r->right_child,pos,val);
r->value=r->left_child->value+r->right_child->value;
}
int query(nod *r,int a, int b)
{
if(r->right_bound<a || r->left_bound>b)
return 0;
if(r->left_bound>=a && r->right_bound<=b)
return r->value;
int s1 = query(r->left_child,a,b);
int s2 = query(r->right_child,a,b);
return s1+s2;
}
long long s[100005];
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
fin>>ar[i];
int c,x,y,z;
nod *q=create_nod(ar,1,n);
for(int i=1;i<=m;i++)
{
fin>>c;
if(c==0 || c==1)
fin>>x>>y;
else if(c==2)
fin>>z;
if(c==0)
update(q,x,y);
if(c==1)
fout<<query(q,x,y)<<"\n";
if(c==2)
{
bool ok=false;
int j=1;
while(j<=n)
{
if(query(q,1,j)==z)
{
ok=true;
fout<<j<<"\n";
break;
}
j++;
}
if(!ok)
fout<<-1<<"\n";
}
}
free_nod(q);
return 0;
}