Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #include<cstdio>
- using namespace std;
- #define READ freopen("in.txt", "r", stdin)
- #define WRITE freopen("out.txt", "w", stdout)
- #define ll int long long
- #define ull unsigned long long
- #define ld long double
- #define lld long long double
- #define pi acos(-1)
- #define pb push_back
- #define pbk pop_back
- #define m_p make_pair
- #define gcd(a,b) __gcd(a,b)
- #define lcd(a,b) (a/gcd(a,b))*b
- #define INF 1000010
- #define M 1000000000+7
- #define dist(ax,ay,bx,by) ((ax-bx)*(ax-bx)+(ay-by)*(ay-by))
- #define sort(t) sort(t.begin(),t.end())
- //int a[8]= {-1,-1,-1,0,0,1,1,1};
- //int b[8]= {-1,0,1,-1,1,-1,0,1};
- //int n;
- int arr[100000+10];
- int tree[400000 + 100];
- int init(int node, int b, int e)
- {
- if (b == e)
- {
- tree[node] = arr[b];
- return arr[b];
- }
- int Left = node * 2;
- int Right = node * 2 + 1;
- int mid = (b + e) / 2;
- int x=init(Left, b, mid);
- int y= init(Right, mid + 1, e);
- return tree[node] = min(x,y);
- }
- int query(int node, int b, int e, int i, int j)
- {
- if (i > e || j < b)
- return -1;
- if (b >= i && e <= j)
- return tree[node];
- int Left = node * 2;
- int Right = node * 2 + 1;
- int mid = (b + e) / 2;
- int p1 = query(Left, b, mid, i, j);
- int p2 = query(Right, mid + 1, e, i, j);
- return min(p1, p2);
- }
- ll area(int n,int b,int e)
- {
- if(b>e) return 0;
- if(b==e) return arr[b];
- int mn=query(1,1,n,b,e);
- ll ans=max(area(n,b,mn-1),area(n,mn+1,e));
- ll ans2=(e-b+1)*(arr[mn]);
- return max(ans,ans2);
- }
- int main()
- {
- int t,n,kase=0;
- scanf("%d ",&t);
- while(t--)
- {
- scanf("%d",&n);
- for(int i=1;i<=n;i++)
- scanf("%d ",&arr[i]);
- init(1,1,n);
- printf("Case %d: %lld\n",++kase,area(n,1,n));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment