Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int MX = (1<<20);
- int T , n;
- int arr[MX];
- vector < pair < int , pair < int , int > > > sol;
- bool nosol = 0;
- int solve(int l , int r , int dec){
- if(l == r) return 1;
- int lmn = (1<<30) , lmx = -1;
- int rmn = (1<<30) , rmx = -1;
- int mxv = r - l + 1;
- for(int it1 = l , it2 = r , counter = 0 ; counter < (r - l + 2)/2 && !nosol && it1 < r && it2 > l ; it1++ , it2--){
- lmn = min(lmn , arr[it1] - dec);
- lmx = max(lmx , arr[it1] - dec);
- rmn = min(rmn , arr[it2] - dec);
- rmx = max(rmx , arr[it2] - dec);
- if(lmn == 1 && lmx - lmn == it1 - l)
- sol.push_back({1 , {solve(l , it1 , dec) , solve(it1 + 1 , r , dec + it1 - l + 1)}});
- else if(rmn == 1 && rmx - rmn == r - it2)
- sol.push_back({2 , {solve(l , it2 - 1 , dec + r - it2 + 1) , solve(it2 , r , dec)}});
- else if(lmx == mxv && lmx - lmn == it1 - l)
- sol.push_back({2 , {solve(l , it1 , dec + r - it1) , solve(it1 + 1 , r , dec)}});
- else if(rmx == mxv && rmx - rmn == r - it2)
- sol.push_back({1 , { solve(l , it2 - 1 , dec) , solve(it2 , r , dec + it2 - l) }});
- else continue;
- return 1 + sol.size();
- }
- nosol = 1;
- return 0;
- }
- int main(){
- scanf("%d",&T);
- while(T--){
- scanf("%d",&n);
- for(int j = 1 ; j <= n ; j++)
- scanf("%d",&arr[j]);
- sol.clear();
- nosol = 0;
- solve(1,n,0);
- if(nosol) puts("NO");
- else{
- puts("YES");
- cout<<sol.size()<<endl;
- for(auto pp : sol)
- printf("%d %d %d\n",pp.second.first,pp.second.second,pp.first);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement