// Problem: 1141_F2. Same Sum Blocks (Hard)
// Time complexity: quadratic
import java.util.*;
import java.io.*;
import java.math.*;
public class Solution{
    
    static class Node implements Comparable<Node>{
        int sum;
        int l;
        int r;
        Node next;
        int nb;
        Node ini;
        boolean not;
        public Node(int sum,int l,int r){
            this.sum = sum;
            this.l = l;
            this.r = r;
            nb = 0;
            not = false;
            ini = null;
        }
        
        @Override
        public int compareTo(Node node){
            if(sum-node.sum!=0) return sum-node.sum;
            else if(l-node.l!=0) return l-node.l;
            else return r - node.r;
        }
    }
    
    public static void main(String[] args)throws IOException{
                
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        PrintWriter out = new PrintWriter(System.out);
        
        int n = Integer.parseInt(st.nextToken());
        
        TreeSet<Node> ts = new TreeSet<Node>();
        
        st = new StringTokenizer(br.readLine());
        int[] a = new int[n+1];
        for(int i=1;i<=n;i++) a[i] = Integer.parseInt(st.nextToken());
        
        int[] s = new int[n+1];
        for(int i=1;i<=n;i++) s[i] = s[i-1] + a[i];
        
        for(int i=1;i<=n;i++){
            for(int j=i;j<=n;j++){
                ts.add(new Node(s[j]-s[i-1],i,j));
            }
        }
        int minvalue = -2000*(int)Math.pow(10,5);
        int maxvalue = 2000*(int)Math.pow(10,5);
        ts.add(new Node(minvalue,0,0));
        ts.add(new Node(maxvalue,0,0));
        //System.out.println(minvalue);
        Node node = ts.higher(ts.first());
        
        int sum = 0;
        
        
        
        int max = 0;
        Node m = null;
        
        while(node.sum!=maxvalue){
            
            sum = node.sum;
            while(node.sum==sum){
                node = ts.higher(node);
            }
            
            Node var = ts.lower(node);
           // System.out.println(sum+" "+var.sum);
            max = 0;
            while(var.sum==sum){
                
                Node next = ts.higher(new Node(sum,var.r+1,0));
                
                if(max>1+next.nb){
                    var.nb = max;
                    var.ini = m;
                }
                else if(next.ini==null){
                
                    var.nb = 1 + next.nb;
                    var.next = next;
                    if(max<var.nb){
                        max = var.nb;
                        m = var;
                    }
                    
                    
                }else{
                    
                    var.nb = 1 + next.nb;
                    var.next = next.ini;
                    if(max<var.nb){
                        max = var.nb;
                        m = var;
                    }
                    
                }
                
            
                var = ts.lower(var);
                    
                //System.out.println(sum+" "+var.sum);
            }
            
            
        }
        
        int k = 0;
        Node best = new Node(minvalue,0,0);

        //var = new Node(minvalue,0,0);
        for(Node var:ts){
            if(k<var.nb){
                k = var.nb;
                best = var;
                if(var.ini!=null) best = var.ini;
            }
        }
        
        if(k==0) System.out.println("erreur");
        else{
            
            out.println(k);
            sum = best.sum;
            while(best.sum==sum){
                out.println(best.l+" "+best.r);
                best = best.next;
            }
            
        }
        
        
        out.flush();
        
    }
    
}