Range Minimum Query
問題文
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_A
Range Minimum Queryを平方分割で解いた。
#include<iostream> #include<algorithm> #include<vector> #include<climits> #define max_n 100000 using namespace std; typedef long long ll; const ll B=1000; ll a[max_n],m[max_n/B]; void update(ll i,ll x){ a[i]=x; m[i/B]=INT_MAX; for(int j=i-i%B;j<i-i%B+B;j++) m[i/B]=min(m[i/B],a[j]); } ll find(ll s,ll t){ ll res=INT_MAX; for(int i=s/B+1;i<t/B;i++){ res=min(res,m[i]); } for(int i=s;i<min(s-s%B+B,t+1);i++)res=min(res,a[i]); for(int i=max(s,t-t%B);i<=t;i++)res=min(res,a[i]); return res; } int main(void){ int n,q; cin >> n >> q; fill(m,m+max_n/B,INT_MAX); fill(a,a+max_n,INT_MAX); ll com,x,y; for(int i=0;i<q;i++){ cin >> com >> x >> y; if(com==0)update(x,y); else cout << find(x,y) << endl; } return 0; }