Cod sursa(job #1970819)

Utilizator otto1Palaga Vicentiu-Octavian otto1 Data 19 aprilie 2017 17:09:00
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include<fstream>
using namespace std;
int n,m,x,y;
struct nod{int Min,st,dr;nod *l,*r;}*b;
ifstream f("rmq.in");
ofstream g("rmq.out");
void arb(nod *p,int st,int dr)
{p->Min=100001;
p->st=st;
p->dr=dr;
if(st<dr)
{p->l=new nod;
arb(p->l,st,(st+dr)/2);
p->r=new nod;
arb(p->r,(st+dr)/2+1,dr);
}
}
int t(nod *p,int x,int y)
{if(x<=p->st&&p->dr<=y)
return p->Min;
else
{int Min=100001;
if(x<=(p->st+p->dr)/2)
Min=min(Min,t(p->l,x,y));
if(y>(p->st+p->dr)/2)
Min=min(Min,t(p->r,x,y));
return Min;
}
}
void o(nod *p,int x,int y)
{if(p->st==p->dr)
p->Min=y;
else
{if(x<=(p->st+p->dr)/2)
o(p->l,x,y);
else
o(p->r,x,y);
p->Min=min(p->l->Min,p->r->Min);
}
}
int main()
{b=new nod;
f>>n>>m;
arb(b,1,n);
for(int i=1;i<=n;i++)
{f>>x;
o(b,i,x);
}
for(int i=1;i<=m;i++)
{f>>x>>y;
g<<t(b,x,y)<<'\n';
}
}