#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
#include<queue>
#include<stack>
#include<cmath>
#include<cstring>
#include<iomanip>
using namespace std;
#define R(x) x=read()
#define MAXN 100010
#define lc x<<1
#define rc x<<1|1
#define mid (l+r)/2
#define INF 0x3f3f3f3f
inline int read()
{
int x,y;
char c=getchar();
x=0,y=1;
while(c<'0'||c>'9') {if(c=='-') y=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*y;
}
struct node
{
int sum;
int add;
}tree[MAXN*4];
void pushup(int);
void pushdown(int,int,int);
int query(int,int,int,int,int);
void build(int,int,int);
void add(int,int,int,int,int,int);
int a[MAXN];
int b[MAXN]={0},tot=0;
int main()
{
int n,m;
R(n);R(m);
for(int i=1;i<=n;i++) R(a[i]);
build(1,1,n);
int minn;
for(int i=1;i<=m;i++)
{
int x,y;
R(x);R(y);
minn=query(1,1,n,x,y);
b[++tot]=minn;
}
for(int i=1;i<=tot;i++)
cout<<b[i]<<' ';
return 0;
}
void pushup(int x)
{
tree[x].sum=tree[lc].sum+tree[rc].sum;
}
void pushdown(int x,int l,int r)
{
tree[lc].add+=tree[x].add;
tree[rc].add+=tree[x].add;
tree[lc].sum+=tree[x].add*(mid-l+1);
tree[rc].sum+=tree[x].add*(r-mid);
tree[x].add=0;
}
int query(int x,int l,int r,int from,int to)
{
if(l>=from&&r<=to) return tree[x].sum;
pushdown(x,l,r);
int minn=INF;
if(from<=mid) minn=min(minn,query(lc,l,mid,from,to));
if(to>mid) minn=min(minn,query(rc,mid+1,r,from,to));
return minn;
}
void build(int x,int l,int r)
{
if(l==r)
{
tree[x].sum=a[l];
return;
}
build(lc,l,mid);
build(rc,mid+1,r);
pushup(x);
}
样例最后一个跑不过
orz orz