Cod sursa(job #1518890)

Utilizator zacuscaAlex Iordache zacusca Data 6 noiembrie 2015 15:52:06
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#define DIM 100001
using namespace std;

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

int n, m, x, y, ARB[3 * DIM];

inline int min (int a, int b){if (a < b) return a; return b;}

void update (int nod, int st, int dr, int poz, int val)
{
   if (st == dr)
      ARB[nod] += val;
   else
   {
      int mij = ((dr + st) >> 1);
      if (poz <= mij)
       update ((nod << 1), st, mij, poz, val);
      else update (1 + (nod << 1), mij + 1, dr, poz, val);
      ARB[nod] = min (ARB[nod << 1], ARB[1 + (nod << 1)]);
   }
}

void query (int nod, int st, int dr, int x, int y, int &sol)
{
   if (x <= st and dr <= y) sol = min (sol, ARB[nod]);
   else
   {
      int mij = ((dr + st) >> 1);
      if (x <= mij)
       query (nod << 1, st, mij, x, y, sol);
      if (mij < y)
       query (1 + (nod << 1), mij + 1, dr, x, y, sol);
   }
}

int main()
{
   in >> n >> m;
   for (int i = 1; i <= n; i++)
   {
    in >> x;
    update (1, 1, n, i, x);
   }
   for (int i = 1, sol; i <= m; i++)
   {
    sol = (1 << 30);
    in >> x >> y;
    query (1, 1, n, x, y, sol);
    out << sol << '\n';
   }

   out.close ();
   return 0;
}