[51Nod]1174区间中最大的数
论莫队算法在RMQ中的没什么乱用的用处。。。

1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdlib> 5 #include <map> 6 #include <string> 7 #include <vector> 8 #include <stack> 9 #include <cmath> 10 #include <queue> 11 #include <cstdio> 12 #include <set> 13 using namespace std; 14 15 multiset<int>s; 16 int a[20000],ans[20000],n,q,l,r; 17 struct ASK{ 18 int l,r,id; 19 bool operator < (ASK b) const{ 20 if(l/n==b.l/n)return r<b.r; 21 return l/n<b.l/n; 22 } 23 }ask[20000]; 24 int main(){ 25 scanf("%d",&n); 26 for(int i=1;i<=n;i++)scanf("%d",&a[i]); 27 scanf("%d",&q); 28 for(int i=1;i<=q;i++)scanf("%d%d",&ask[i].l,&ask[i].r),ask[i].id=i,ask[i].l++,ask[i].r++; 29 n=sqrt(n); 30 sort(ask+1,ask+1+q); 31 l=ask[1].l,r=ask[1].r; 32 for(int i=l;i<=r;i++)s.insert(a[i]); 33 ans[ask[1].id]=*--s.end(); 34 for(int i=2;i<=q;i++){ 35 while(r<ask[i].r)s.insert(a[++r]); 36 while(r>ask[i].r)s.erase(a[r--]); 37 while(l<ask[i].l)s.erase(a[l++]); 38 while(l>ask[i].l)s.insert(a[--l]); 39 ans[ask[i].id]=*--s.end(); 40 } 41 for(int i=1;i<=q;i++)printf("%d\n",ans[i]); 42 }