Cod sursa(job #3030201)

Utilizator Emmy432622Rotariu Emanuel Emmy432622 Data 17 martie 2023 15:52:46
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

/// min-tree

const int nmax = 1e5+5;
const int inf = 1e6;
int t[4*nmax],lazy[4*nmax];

void update(int nod, int st, int en, int l, int r, int val)
{
    if(lazy[nod])
    {
        t[nod]+=lazy[nod];
        if(st!=en)
        {
            lazy[2*nod]+=lazy[nod];
            lazy[2*nod+1]+=lazy[nod];
        }
        lazy[nod]=0;
    }
    if(st>r || en<l)
        return;

    if(st>=l && en<=r)
    {
        t[nod]+=val;
        if(st!=en)
        {
            lazy[2*nod]+=val;
            lazy[2*nod+1]+=val;
        }
        return;
    }

    int mid = (st+en)/2;
    update(2*nod,st,mid,l,r,val);
    update(2*nod+1,mid+1,en,l,r,val);
    t[nod]=min(t[2*nod],t[2*nod+1]);
}

int get(int nod, int st, int en, int l, int r)
{
    if(lazy[nod])
    {
        t[nod]+=lazy[nod];
        if(st!=en)
        {
            lazy[2*nod]+=lazy[nod];
            lazy[2*nod+1]+=lazy[nod];
        }
        lazy[nod]=0;
    }

    if(st>r || en<l)
        return inf;

    if(st>=l && en<=r)
        return t[nod];

    int mid=(st+en)/2;
    return min(get(2*nod,st,mid,l,r),
               get(2*nod+1,mid+1,en,l,r));
}

int main()
{
    int n,m;
    fin >> n >> m;
    for(int i=1 ; i<=n ; ++i)
    {
        int x;
        fin >> x;
        update(1,1,n,i,i,x);
    }
    for(int i=1 ; i<=m ; ++i)
    {
        int a, b;
        fin >> a >> b;
        fout << get(1,1,n,a,b) << '\n';

    }

    return 0;
}