Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <string>
- #include <assert.h>
- using namespace std;
- long long readInt(long long l,long long r,char endd){
- long long x=0;
- int cnt=0;
- int fi=-1;
- bool is_neg=false;
- while(true){
- char g=getchar();
- if(g=='-'){
- assert(fi==-1);
- is_neg=true;
- continue;
- }
- if('0'<=g && g<='9'){
- x*=10;
- x+=g-'0';
- if(cnt==0){
- fi=g-'0';
- }
- cnt++;
- assert(fi!=0 || cnt==1);
- assert(fi!=0 || is_neg==false);
- assert(!(cnt>19 || ( cnt==19 && fi>1) ));
- } else if(g==endd){
- assert(cnt>0);
- if(is_neg){
- x= -x;
- }
- assert(l<=x && x<=r);
- return x;
- } else {
- assert(false);
- }
- }
- }
- string readString(int l,int r,char endd){
- string ret="";
- int cnt=0;
- while(true){
- char g=getchar();
- assert(g!=-1);
- if(g==endd){
- break;
- }
- cnt++;
- ret+=g;
- }
- assert(l<=cnt && cnt<=r);
- return ret;
- }
- long long readIntSp(long long l,long long r){
- return readInt(l,r,' ');
- }
- long long readIntLn(long long l,long long r){
- return readInt(l,r,'\n');
- }
- string readStringLn(int l,int r){
- return readString(l,r,'\n');
- }
- string readStringSp(int l,int r){
- return readString(l,r,' ');
- }
- int T;
- int n;
- int sm_n=0;
- int p[1001001];
- int pos[1001001];
- bool vis[1001001];
- int ii[1001001];
- int jj[1001001];
- int op[1001001];
- int m=0;
- bool ok=true;
- int solve(int l,int r,int low,int up){
- if(l==r){
- return 1;
- }
- if(pos[low] < pos[up] ){
- int ll=l,rr=r;
- int mx_l=-1<<30;
- int mn_r= 1<<30;
- int mid=-1;
- while(ll<rr){
- mx_l=max(mx_l,p[ll]);
- if(ll- l == mx_l - low ){
- mid = ll;
- break;
- }
- ll++;
- mn_r = min(mn_r,p[rr]);
- if(r-rr == up - mn_r){
- mid = rr-1;
- break;
- }
- rr--;
- }
- if(mid == -1){
- ok=false;
- return -1;
- }
- int _i = solve(l,mid,low,low + mid - l);
- int _j = solve(mid+1,r,up - (r-mid-1),up);
- ii[m] = _i;
- jj[m] = _j;
- op[m] = 1;
- m++;
- return m-1;
- } else {
- int ll=l,rr=r;
- int mn_l=1<<30;
- int mx_r=-1<<30;
- int mid=-1;
- while(ll<rr){
- mn_l=min(mn_l,p[ll]);
- if(ll- l == up - mn_l ){
- mid = ll;
- break;
- }
- ll++;
- mx_r = max(mx_r,p[rr]);
- if(r-rr == mx_r - low){
- mid = rr-1;
- break;
- }
- rr--;
- }
- if(mid == -1){
- ok=false;
- return -1;
- }
- int _i = solve(l,mid,up - (mid-l),up);
- int _j = solve(mid+1,r,low,low + (r - mid-1));
- ii[m] = _i;
- jj[m] = _j;
- op[m] = 2;
- m++;
- return m-1;
- }
- }
- int main(){
- //freopen("07.txt","r",stdin);
- //freopen("07oo.txt","w",stdout);
- T=readIntLn(1,1000);
- while(T--){
- n=readIntLn(2,1000000);
- sm_n +=n ;
- assert(sm_n<=1000000);
- for(int i=1;i<=n;i++){
- vis[i]=false;
- }
- m=2;
- ok=true;
- for(int i=1;i<=n;i++){
- if(i==n){
- p[i]=readIntLn(1,n);
- } else {
- p[i]=readIntSp(1,n);
- }
- pos[p[i]]=i;
- assert(vis[p[i]]==false);
- vis[p[i]]=true;
- }
- solve(1,n,1,n);
- if(!ok){
- //cout<<"NO"<<endl;
- printf("NO\n");
- } else {
- //cout<<"YES"<<endl;
- printf("YES\n");
- //cout<<m-2<<endl;
- printf("%d\n",m-2);
- for(int i=2;i<m;i++){
- printf("%d %d %d\n",ii[i],jj[i],op[i]);
- //cout<<ii[i]<< " "<<jj[i]<<" "<<op[i]<<endl;
- }
- }
- }
- assert(getchar()==-1);
- }
Add Comment
Please, Sign In to add comment