Cod sursa(job #2785869)

Utilizator AndreidreiGresoiu Liviu-Andrei Andreidrei Data 19 octombrie 2021 18:57:04
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <bits/stdc++.h>
#define din cin
#define dout out
#define pi 3.14159265359
#define sw(x,y) x^=y,y^=x,x^=y
#define bmin(a,b)((a<b)?(a):(b))
#define bmax(a,b)((a>b)?(a):(b))
#define ll long long
using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
long long n,m,a[500000],i,j,k=1,x,y,z;
int main()
{
in>>n>>m;
while(k<n)k<<=1;
for(i=k;i<k+n;i++)in>>a[i];
i=k;
while(--i)a[i]=a[i*2]+a[i*2+1];
//for(i=1;i<2*k;i++)cout<<a[i]<<'\n';
while(m--)
{
    in>>x>>y;
    if(x==0)
    {
        in>>z;
        y+=k-1;
        while(y)a[y]-=z,y>>=1;
    }
        else if(x==1)
        {
            in>>z,x=0,y+=k-1,z+=k-1;
            while(y!=z)
            {
                if(y&1)x-=a[y-1];
                if(~z&1)x-=a[z+1];
                y/=2,z/=2;
            }
            out<<x+a[y]<<'\n';
        }
        else{
            i=1;
            while(i<k)
                if(y>a[i*2])
                    y-=a[i*2],i=i*2+1;
                    else i*=2;
            if(y==a[i])out<<i-k+1<<'\n';else out<<"-1\n";
        }
}
}