Cod sursa(job #2550371)

Utilizator PaulOrasanPaul Orasan PaulOrasan Data 18 februarie 2020 19:26:08
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.24 kb
#include <iostream>
#include <queue>
using namespace std;
/*
ifstream fin("input.in");
ofstream fout("output.out");
*/
const int NMAX=100005, inf=10000000;

int v[NMAX],n,q;
int arb[NMAX*10];

struct INTERVAL{
    int st, dr;
}interval[NMAX*10];
void citire()
{
    cin>>n>>q;
    for (int i=1; i<=n; i++)
        cin>>v[i];
}
void creareArbore(int rad, int st, int dr)
{
    if (st==dr){
        interval[rad].st=st;
        interval[rad].dr=dr;
        arb[rad]=v[st];
    }else{
        interval[rad].st=st;
        interval[rad].dr=dr;
        int mij=(st+dr)/2;
        creareArbore(2*rad,st,mij);
        creareArbore(2*rad+1,mij+1,dr);
        arb[rad]=min(arb[2*rad],arb[2*rad+1]);
    }
}
void BFS(int rad)
{
    queue<int>q;
    int container;
    q.push(rad);
    while (!q.empty()){
        container=q.front();
        q.pop();
        if (interval[container].st!=0){
            cout<<interval[container].st<<' '<<interval[container].dr<<' '<<arb[container]<<'\n';
            q.push(2*container);
            q.push(2*container+1);
        }
    }
}
int query(int rad, int st, int dr)
{
    if (interval[rad].st==0 || interval[rad].dr==0)
        return inf;
    if (interval[rad].dr<st || interval[rad].st>dr)
        return inf;
    if (interval[rad].st>=st && interval[rad].dr<=dr)
        return arb[rad];
    int mij=(st+dr)/2;
    return min(query(2*rad,st,dr),query(2*rad+1,st,dr));
}
void update(int rad, int x, int val)
{
    if (interval[rad].st==x && interval[rad].dr==x){
        arb[rad]=val;
        return;
    }
    int mij=(interval[rad].st+interval[rad].dr)/2;
    if (interval[rad].st<=x && x<=mij){
        update(2*rad,x,val);
        arb[rad]=min(arb[rad*2],arb[2*rad+1]);
    }else if (interval[rad].dr>=x && x>mij){
        update(2*rad+1,x,val);
        arb[rad]=min(arb[rad*2],arb[2*rad+1]);
    }
    return;
}
void rezolvare()
{
    char c;
    int x, y;
    for (int i=1; i<=q; i++){
        cin.get();
        cin>>c;
        cin>>x>>y;
        if (c=='u'){
            update(1,x,y);
            v[x]=y;
        }else{
            cout<<query(1,x,y)<<'\n';
        }
    }
}
int main()
{
    citire();
    creareArbore(1,1,n);
    rezolvare();
}