题目9 : Minimum
描述
You are given a list of integers a0, a1, …, a2^k-1.
You need to support two types of queries:
1. Output Minx,y∈[l,r] {ax∙ay}.
2. Let ax=y.
输入
The first line is an integer T, indicating the number of test cases. (1≤T≤10).
For each test case:
The first line contains an integer k (0 ≤ k ≤ 17).
The following line contains 2k integers, a0, a1, …, a2^k-1 (-2k ≤ ai < 2k).
The next line contains a integer (1 ≤ Q < 2k), indicating the number of queries. Then next Q lines, each line is one of:
1. 1 l r: Output Minx,y∈[l,r]{ax∙ay}. (0 ≤ l ≤ r < 2k)
2. 2 x y: Let ax=y. (0 ≤ x < 2k, -2k ≤ y < 2k)
输出
For each query 1, output a line contains an integer, indicating the answer.
-
样例输入
-
1 3 1 1 2 2 1 1 2 2 5 1 0 7 1 1 2 2 1 2 2 2 2 1 1 2
样例输出
-
1 1
4
-
-
题目大意:给出一串数字,对应2个操作,1.查询x,y区间内最小的两数乘积,2.更新单点的值
-
-
思路:线段树模版题,记录区间最大值与最小值,根据其正负输出答案
-
#include<iostream> #include<cstring> #include<stdio.h> #include<math.h> #include<string> #include<stdio.h> #include<queue> #include<stack> #include<map> #include<vector> #include<deque> #include<algorithm> #define ll long long #define INF 1008611111 #define M (t[k].l+t[k].r)/2 #define lson k*2 #define rson k*2+1 using namespace std; ll pmax,pmin; struct node { int l,r; ll minn; ll maxx; }t[600000]; void pushup(int k) { t[k].minn=min(t[lson].minn,t[rson].minn); t[k].maxx=max(t[lson].maxx,t[rson].maxx); } void build(int l,int r,int k) { t[k].l=l; t[k].r=r; if(l==r) { scanf("%lld",&t[k].minn); t[k].maxx=t[k].minn; return; } int mid=M; build(l,mid,lson); build(mid+1,r,rson); pushup(k); } void update(int pos,int k,int v) { if(t[k].l==t[k].r) { t[k].minn=v; t[k].maxx=v; return; } int mid=M; if(pos<=mid) update(pos,lson,v); else update(pos,rson,v); pushup(k); } void query(int l,int r,int k) { if(t[k].l==l&&t[k].r==r) { pmin=min(t[k].minn,pmin); pmax=max(t[k].maxx,pmax); return; } int mid=M; if(r<=mid) query(l,r,lson); else if(l>mid) query(l,r,rson); else { query(l,mid,lson); query(mid+1,r,rson); } } int main() { int i,j,n,m,test,k,d,x,y; scanf("%d",&test); while(test--) { scanf("%d",&k); n=1; for(i=0;i<k;i++) n*=2; build(0,n-1,1); scanf("%d",&m); for(i=0;i<m;i++) { scanf("%d%d%d",&d,&x,&y); if(d==1) { pmin=INF; pmax=-INF; query(x,y,1); if(pmin>=0) { printf("%lld\n",pmin*pmin); } else { if(pmax>=0) printf("%lld\n",pmax*pmin); else printf("%lld\n",pmax*pmax); } } else { update(x,1,y); } } } }